@alfalab/core-components-select 15.2.3 → 16.0.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 (362) hide show
  1. package/Component.desktop.d.ts +3 -16
  2. package/Component.desktop.js +4 -2
  3. package/Component.mobile.d.ts +3 -39
  4. package/Component.mobile.js +23 -10
  5. package/Component.modal.mobile.d.ts +2 -58
  6. package/Component.modal.mobile.js +23 -35
  7. package/Component.responsive.d.ts +3 -17
  8. package/Component.responsive.js +11 -13
  9. package/components/arrow/Component.js +1 -1
  10. package/components/arrow/index.css +5 -5
  11. package/components/base-checkmark/Component.js +1 -1
  12. package/components/base-checkmark/index.css +4 -4
  13. package/components/base-option/Component.js +1 -1
  14. package/components/base-option/index.css +16 -16
  15. package/components/base-select/Component.d.ts +17 -2
  16. package/components/base-select/Component.js +188 -81
  17. package/components/base-select/index.css +12 -12
  18. package/components/base-select/index.js +1 -1
  19. package/{esm/components/base-select-mobile/index.css → components/base-select/mobile.css} +13 -22
  20. package/components/checkmark/Component.js +1 -1
  21. package/components/checkmark/index.css +11 -11
  22. package/components/checkmark-mobile/Component.js +1 -1
  23. package/components/checkmark-mobile/index.css +6 -6
  24. package/components/field/Component.js +1 -1
  25. package/components/field/index.css +15 -17
  26. package/components/footer/Component.d.ts +12 -0
  27. package/components/{base-select-mobile/footer → footer}/Component.js +6 -5
  28. package/{modern/components/base-select-mobile → components}/footer/index.css +6 -6
  29. package/components/footer/index.d.ts +1 -0
  30. package/components/{base-select-mobile/footer → footer}/index.js +3 -2
  31. package/components/index.js +2 -1
  32. package/components/optgroup/Component.js +1 -1
  33. package/components/optgroup/index.css +7 -7
  34. package/components/option/Component.js +1 -1
  35. package/components/option/index.css +24 -24
  36. package/components/options-list/Component.js +7 -3
  37. package/components/options-list/index.css +11 -11
  38. package/components/options-list/index.js +2 -1
  39. package/components/search/Component.d.ts +2 -4
  40. package/components/search/Component.js +1 -1
  41. package/components/search/index.css +2 -2
  42. package/components/virtual-options-list/Component.js +7 -3
  43. package/components/virtual-options-list/index.css +18 -18
  44. package/components/virtual-options-list/index.js +2 -1
  45. package/cssm/Component.desktop.d.ts +3 -16
  46. package/cssm/Component.desktop.js +5 -2
  47. package/cssm/Component.mobile.d.ts +3 -39
  48. package/cssm/Component.mobile.js +27 -13
  49. package/cssm/Component.modal.mobile.d.ts +2 -58
  50. package/cssm/Component.modal.mobile.js +28 -39
  51. package/cssm/Component.responsive.d.ts +3 -17
  52. package/cssm/Component.responsive.js +13 -15
  53. package/cssm/components/arrow/index.module.css +2 -2
  54. package/cssm/components/base-option/index.module.css +3 -3
  55. package/cssm/components/base-select/Component.d.ts +17 -2
  56. package/cssm/components/base-select/Component.js +186 -80
  57. package/cssm/components/base-select/index.js +2 -1
  58. package/cssm/components/base-select/index.module.css +2 -2
  59. package/cssm/components/{base-select-mobile/index.module.css → base-select/mobile.module.css} +0 -9
  60. package/cssm/components/checkmark/index.module.css +1 -1
  61. package/cssm/components/field/index.module.css +3 -5
  62. package/cssm/components/footer/Component.d.ts +12 -0
  63. package/cssm/components/{base-select-mobile/footer → footer}/Component.js +5 -4
  64. package/cssm/components/footer/index.d.ts +1 -0
  65. package/cssm/components/{base-select-mobile/footer → footer}/index.js +3 -2
  66. package/cssm/components/{base-select-mobile/footer → footer}/index.module.css +1 -1
  67. package/cssm/components/index.js +3 -1
  68. package/cssm/components/optgroup/index.module.css +1 -1
  69. package/cssm/components/option/index.module.css +4 -4
  70. package/cssm/components/options-list/Component.js +6 -2
  71. package/cssm/components/options-list/index.js +2 -1
  72. package/cssm/components/options-list/index.module.css +2 -2
  73. package/cssm/components/search/Component.d.ts +2 -4
  74. package/cssm/components/virtual-options-list/Component.js +6 -2
  75. package/cssm/components/virtual-options-list/index.js +2 -1
  76. package/cssm/components/virtual-options-list/index.module.css +3 -3
  77. package/cssm/desktop/index.d.ts +2 -0
  78. package/cssm/desktop/index.js +51 -0
  79. package/cssm/{hook-244c8d6e.js → hook-2f9ec939.js} +9 -5
  80. package/{esm/hook-8abfea97.d.ts → cssm/hook-ad89c253.d.ts} +3 -2
  81. package/cssm/index.d.ts +2 -2
  82. package/cssm/index.js +10 -9
  83. package/cssm/mobile/index.d.ts +3 -0
  84. package/cssm/mobile/index.js +67 -0
  85. package/cssm/presets/index.d.ts +1 -1
  86. package/cssm/presets/index.js +3 -2
  87. package/cssm/presets/useSelectWithApply/hook.js +3 -2
  88. package/cssm/presets/useSelectWithApply/options-list-with-apply/Component.js +3 -2
  89. package/cssm/presets/useSelectWithApply/options-list-with-apply/index.d.ts +1 -1
  90. package/cssm/presets/useSelectWithApply/options-list-with-apply/index.js +3 -2
  91. package/cssm/shared/index.d.ts +12 -0
  92. package/cssm/shared/index.js +87 -0
  93. package/cssm/typings.d.ts +86 -7
  94. package/desktop/index.d.ts +2 -0
  95. package/{desktop.js → desktop/index.js} +16 -14
  96. package/desktop/package.json +3 -0
  97. package/esm/Component.desktop.d.ts +3 -16
  98. package/esm/Component.desktop.js +4 -2
  99. package/esm/Component.mobile.d.ts +3 -39
  100. package/esm/Component.mobile.js +22 -9
  101. package/esm/Component.modal.mobile.d.ts +2 -58
  102. package/esm/Component.modal.mobile.js +24 -36
  103. package/esm/Component.responsive.d.ts +3 -17
  104. package/esm/Component.responsive.js +11 -13
  105. package/esm/components/arrow/Component.js +1 -1
  106. package/esm/components/arrow/index.css +5 -5
  107. package/esm/components/base-checkmark/Component.js +1 -1
  108. package/esm/components/base-checkmark/index.css +4 -4
  109. package/esm/components/base-option/Component.js +1 -1
  110. package/esm/components/base-option/index.css +16 -16
  111. package/esm/components/base-select/Component.d.ts +17 -2
  112. package/esm/components/base-select/Component.js +190 -83
  113. package/esm/components/base-select/index.css +12 -12
  114. package/esm/components/base-select/index.js +1 -1
  115. package/{components/base-select-mobile/index.css → esm/components/base-select/mobile.css} +13 -22
  116. package/esm/components/checkmark/Component.js +1 -1
  117. package/esm/components/checkmark/index.css +11 -11
  118. package/esm/components/checkmark-mobile/Component.js +1 -1
  119. package/esm/components/checkmark-mobile/index.css +6 -6
  120. package/esm/components/field/Component.js +1 -1
  121. package/esm/components/field/index.css +15 -17
  122. package/esm/components/footer/Component.d.ts +12 -0
  123. package/esm/components/{base-select-mobile/footer → footer}/Component.js +6 -5
  124. package/{components/base-select-mobile → esm/components}/footer/index.css +6 -6
  125. package/esm/components/footer/index.d.ts +1 -0
  126. package/esm/components/{base-select-mobile/footer → footer}/index.js +1 -0
  127. package/esm/components/index.js +2 -1
  128. package/esm/components/optgroup/Component.js +1 -1
  129. package/esm/components/optgroup/index.css +7 -7
  130. package/esm/components/option/Component.js +1 -1
  131. package/esm/components/option/index.css +24 -24
  132. package/esm/components/options-list/Component.js +7 -3
  133. package/esm/components/options-list/index.css +11 -11
  134. package/esm/components/options-list/index.js +2 -1
  135. package/esm/components/search/Component.d.ts +2 -4
  136. package/esm/components/search/Component.js +1 -1
  137. package/esm/components/search/index.css +2 -2
  138. package/esm/components/virtual-options-list/Component.js +7 -3
  139. package/esm/components/virtual-options-list/index.css +18 -18
  140. package/esm/components/virtual-options-list/index.js +2 -1
  141. package/esm/desktop/index.d.ts +2 -0
  142. package/esm/{desktop.js → desktop/index.js} +16 -14
  143. package/esm/{hook-e63a15d0.js → hook-8209d0d1.js} +10 -6
  144. package/{cssm/hook-8abfea97.d.ts → esm/hook-ad89c253.d.ts} +3 -2
  145. package/esm/index.d.ts +2 -2
  146. package/esm/index.js +8 -7
  147. package/esm/mobile/index.d.ts +3 -0
  148. package/esm/mobile/index.js +44 -0
  149. package/esm/presets/index.d.ts +1 -1
  150. package/esm/presets/index.js +3 -2
  151. package/esm/presets/useSelectWithApply/hook.js +3 -2
  152. package/esm/presets/useSelectWithApply/options-list-with-apply/Component.js +3 -2
  153. package/esm/presets/useSelectWithApply/options-list-with-apply/footer/Component.js +1 -1
  154. package/esm/presets/useSelectWithApply/options-list-with-apply/footer/index.css +3 -3
  155. package/esm/presets/useSelectWithApply/options-list-with-apply/header/Component.js +1 -1
  156. package/esm/presets/useSelectWithApply/options-list-with-apply/header/index.css +3 -3
  157. package/esm/presets/useSelectWithApply/options-list-with-apply/index.d.ts +1 -1
  158. package/esm/presets/useSelectWithApply/options-list-with-apply/index.js +3 -2
  159. package/esm/presets/useSelectWithLoading/hook.js +1 -1
  160. package/esm/presets/useSelectWithLoading/index.css +2 -2
  161. package/esm/shared/index.d.ts +12 -0
  162. package/esm/shared/index.js +42 -0
  163. package/esm/typings.d.ts +86 -7
  164. package/{hook-8abfea97.d.ts → hook-ad89c253.d.ts} +3 -2
  165. package/{hook-74d61833.js → hook-cb17586d.js} +9 -5
  166. package/index.d.ts +2 -2
  167. package/index.js +8 -7
  168. package/mobile/index.d.ts +3 -0
  169. package/mobile/index.js +53 -0
  170. package/mobile/package.json +3 -0
  171. package/modern/Component.desktop.d.ts +3 -16
  172. package/modern/Component.desktop.js +5 -3
  173. package/modern/Component.mobile.d.ts +3 -39
  174. package/modern/Component.mobile.js +29 -13
  175. package/modern/Component.modal.mobile.d.ts +2 -58
  176. package/modern/Component.modal.mobile.js +23 -43
  177. package/modern/Component.responsive.d.ts +3 -17
  178. package/modern/Component.responsive.js +11 -13
  179. package/modern/components/arrow/Component.js +1 -1
  180. package/modern/components/arrow/index.css +5 -5
  181. package/modern/components/base-checkmark/Component.js +1 -1
  182. package/modern/components/base-checkmark/index.css +4 -4
  183. package/modern/components/base-option/Component.js +1 -1
  184. package/modern/components/base-option/index.css +16 -16
  185. package/modern/components/base-select/Component.d.ts +17 -2
  186. package/modern/components/base-select/Component.js +179 -72
  187. package/modern/components/base-select/index.css +12 -12
  188. package/modern/components/base-select/index.js +1 -1
  189. package/modern/components/{base-select-mobile/index.css → base-select/mobile.css} +13 -22
  190. package/modern/components/checkmark/Component.js +1 -1
  191. package/modern/components/checkmark/index.css +11 -11
  192. package/modern/components/checkmark-mobile/Component.js +1 -1
  193. package/modern/components/checkmark-mobile/index.css +6 -6
  194. package/modern/components/field/Component.js +1 -1
  195. package/modern/components/field/index.css +15 -17
  196. package/modern/components/footer/Component.d.ts +12 -0
  197. package/modern/components/{base-select-mobile/footer → footer}/Component.js +5 -4
  198. package/{esm/components/base-select-mobile → modern/components}/footer/index.css +6 -6
  199. package/modern/components/footer/index.d.ts +1 -0
  200. package/modern/components/{base-select-mobile/footer → footer}/index.js +1 -0
  201. package/modern/components/index.js +2 -1
  202. package/modern/components/optgroup/Component.js +1 -1
  203. package/modern/components/optgroup/index.css +7 -7
  204. package/modern/components/option/Component.js +1 -1
  205. package/modern/components/option/index.css +24 -24
  206. package/modern/components/options-list/Component.js +5 -3
  207. package/modern/components/options-list/index.css +11 -11
  208. package/modern/components/options-list/index.js +2 -1
  209. package/modern/components/search/Component.d.ts +2 -4
  210. package/modern/components/search/Component.js +1 -1
  211. package/modern/components/search/index.css +2 -2
  212. package/modern/components/virtual-options-list/Component.js +5 -3
  213. package/modern/components/virtual-options-list/index.css +18 -18
  214. package/modern/components/virtual-options-list/index.js +2 -1
  215. package/modern/desktop/index.d.ts +2 -0
  216. package/modern/{desktop.js → desktop/index.js} +16 -14
  217. package/modern/{hook-5e1db0b0.js → hook-4a3d365d.js} +7 -3
  218. package/modern/{hook-8abfea97.d.ts → hook-ad89c253.d.ts} +3 -2
  219. package/modern/index.d.ts +2 -2
  220. package/modern/index.js +8 -7
  221. package/modern/mobile/index.d.ts +3 -0
  222. package/modern/mobile/index.js +43 -0
  223. package/modern/presets/index.d.ts +1 -1
  224. package/modern/presets/index.js +3 -2
  225. package/modern/presets/useSelectWithApply/hook.js +3 -2
  226. package/modern/presets/useSelectWithApply/options-list-with-apply/Component.js +3 -2
  227. package/modern/presets/useSelectWithApply/options-list-with-apply/footer/Component.js +1 -1
  228. package/modern/presets/useSelectWithApply/options-list-with-apply/footer/index.css +3 -3
  229. package/modern/presets/useSelectWithApply/options-list-with-apply/header/Component.js +1 -1
  230. package/modern/presets/useSelectWithApply/options-list-with-apply/header/index.css +3 -3
  231. package/modern/presets/useSelectWithApply/options-list-with-apply/index.d.ts +1 -1
  232. package/modern/presets/useSelectWithApply/options-list-with-apply/index.js +3 -2
  233. package/modern/presets/useSelectWithLoading/hook.js +1 -1
  234. package/modern/presets/useSelectWithLoading/index.css +2 -2
  235. package/modern/shared/index.d.ts +12 -0
  236. package/modern/shared/index.js +41 -0
  237. package/modern/typings.d.ts +86 -7
  238. package/package.json +12 -10
  239. package/presets/index.d.ts +1 -1
  240. package/presets/index.js +3 -2
  241. package/presets/useSelectWithApply/hook.js +3 -2
  242. package/presets/useSelectWithApply/options-list-with-apply/Component.js +3 -2
  243. package/presets/useSelectWithApply/options-list-with-apply/footer/Component.js +1 -1
  244. package/presets/useSelectWithApply/options-list-with-apply/footer/index.css +3 -3
  245. package/presets/useSelectWithApply/options-list-with-apply/header/Component.js +1 -1
  246. package/presets/useSelectWithApply/options-list-with-apply/header/index.css +3 -3
  247. package/presets/useSelectWithApply/options-list-with-apply/index.d.ts +1 -1
  248. package/presets/useSelectWithApply/options-list-with-apply/index.js +3 -2
  249. package/presets/useSelectWithLoading/hook.js +1 -1
  250. package/presets/useSelectWithLoading/index.css +2 -2
  251. package/shared/index.d.ts +12 -0
  252. package/{shared.js → shared/index.js} +44 -43
  253. package/shared/package.json +3 -0
  254. package/src/Component.desktop.tsx +5 -14
  255. package/src/Component.mobile.tsx +38 -57
  256. package/src/Component.modal.mobile.tsx +5 -147
  257. package/src/Component.responsive.tsx +9 -44
  258. package/src/components/base-select/Component.tsx +380 -156
  259. package/src/components/base-select/index.module.css +1 -1
  260. package/src/components/{base-select-mobile/index.module.css → base-select/mobile.module.css} +0 -15
  261. package/src/components/{base-select-mobile/footer → footer}/Component.tsx +22 -4
  262. package/src/components/{base-select-mobile/footer → footer}/index.module.css +1 -1
  263. package/src/components/footer/index.ts +1 -0
  264. package/src/components/options-list/Component.tsx +6 -2
  265. package/src/components/virtual-options-list/Component.tsx +6 -2
  266. package/src/desktop/index.ts +2 -0
  267. package/src/desktop/package.json +3 -0
  268. package/src/index.ts +2 -4
  269. package/src/mobile/index.ts +4 -0
  270. package/src/mobile/package.json +3 -0
  271. package/src/presets/useSelectWithApply/hook.tsx +9 -3
  272. package/src/shared/index.ts +13 -0
  273. package/src/shared/package.json +3 -0
  274. package/src/typings.ts +110 -9
  275. package/src/vars.css +1 -1
  276. package/typings.d.ts +86 -7
  277. package/Component-89f0cb07.d.ts +0 -38
  278. package/Component.mobile-ebda875c.d.ts +0 -6
  279. package/Component.mobile-f1f15074.d.ts +0 -404
  280. package/components/base-select-mobile/Component.d.ts +0 -70
  281. package/components/base-select-mobile/Component.js +0 -296
  282. package/components/base-select-mobile/footer/Component.d.ts +0 -9
  283. package/components/base-select-mobile/footer/index.d.ts +0 -1
  284. package/components/base-select-mobile/index.d.ts +0 -1
  285. package/components/base-select-mobile/index.js +0 -36
  286. package/cssm/Component-89f0cb07.d.ts +0 -38
  287. package/cssm/Component.mobile-ebda875c.d.ts +0 -6
  288. package/cssm/Component.mobile-f1f15074.d.ts +0 -404
  289. package/cssm/components/base-select-mobile/Component.d.ts +0 -70
  290. package/cssm/components/base-select-mobile/Component.js +0 -303
  291. package/cssm/components/base-select-mobile/footer/Component.d.ts +0 -9
  292. package/cssm/components/base-select-mobile/footer/index.d.ts +0 -1
  293. package/cssm/components/base-select-mobile/index.d.ts +0 -1
  294. package/cssm/components/base-select-mobile/index.js +0 -45
  295. package/cssm/desktop-69921c40.d.ts +0 -6
  296. package/cssm/desktop.d.ts +0 -2
  297. package/cssm/desktop.js +0 -48
  298. package/cssm/index-ebda875c.d.ts +0 -2
  299. package/cssm/mobile-96988a65.d.ts +0 -2
  300. package/cssm/mobile.d.ts +0 -5
  301. package/cssm/mobile.js +0 -62
  302. package/cssm/shared.d.ts +0 -5
  303. package/cssm/shared.js +0 -85
  304. package/cssm/typings-89f0cb07.d.ts +0 -93
  305. package/cssm/typings-baf4875b.d.ts +0 -52
  306. package/desktop-69921c40.d.ts +0 -6
  307. package/desktop.d.ts +0 -2
  308. package/esm/Component-89f0cb07.d.ts +0 -38
  309. package/esm/Component.mobile-ebda875c.d.ts +0 -6
  310. package/esm/Component.mobile-f1f15074.d.ts +0 -404
  311. package/esm/components/base-select-mobile/Component.d.ts +0 -70
  312. package/esm/components/base-select-mobile/Component.js +0 -286
  313. package/esm/components/base-select-mobile/footer/Component.d.ts +0 -9
  314. package/esm/components/base-select-mobile/footer/index.d.ts +0 -1
  315. package/esm/components/base-select-mobile/index.d.ts +0 -1
  316. package/esm/components/base-select-mobile/index.js +0 -28
  317. package/esm/desktop-69921c40.d.ts +0 -6
  318. package/esm/desktop.d.ts +0 -2
  319. package/esm/index-ebda875c.d.ts +0 -2
  320. package/esm/mobile-96988a65.d.ts +0 -2
  321. package/esm/mobile.d.ts +0 -5
  322. package/esm/mobile.js +0 -40
  323. package/esm/shared.d.ts +0 -5
  324. package/esm/shared.js +0 -41
  325. package/esm/typings-89f0cb07.d.ts +0 -93
  326. package/esm/typings-baf4875b.d.ts +0 -52
  327. package/index-ebda875c.d.ts +0 -2
  328. package/mobile-96988a65.d.ts +0 -2
  329. package/mobile.d.ts +0 -5
  330. package/mobile.js +0 -49
  331. package/modern/Component-89f0cb07.d.ts +0 -38
  332. package/modern/Component.mobile-ebda875c.d.ts +0 -6
  333. package/modern/Component.mobile-f1f15074.d.ts +0 -404
  334. package/modern/components/base-select-mobile/Component.d.ts +0 -70
  335. package/modern/components/base-select-mobile/Component.js +0 -285
  336. package/modern/components/base-select-mobile/footer/Component.d.ts +0 -9
  337. package/modern/components/base-select-mobile/footer/index.d.ts +0 -1
  338. package/modern/components/base-select-mobile/index.d.ts +0 -1
  339. package/modern/components/base-select-mobile/index.js +0 -27
  340. package/modern/desktop-69921c40.d.ts +0 -6
  341. package/modern/desktop.d.ts +0 -2
  342. package/modern/index-ebda875c.d.ts +0 -2
  343. package/modern/mobile-96988a65.d.ts +0 -2
  344. package/modern/mobile.d.ts +0 -5
  345. package/modern/mobile.js +0 -39
  346. package/modern/shared.d.ts +0 -5
  347. package/modern/shared.js +0 -40
  348. package/modern/typings-89f0cb07.d.ts +0 -93
  349. package/modern/typings-baf4875b.d.ts +0 -52
  350. package/shared.d.ts +0 -5
  351. package/src/components/base-select-mobile/Component.tsx +0 -572
  352. package/src/components/base-select-mobile/footer/index.ts +0 -1
  353. package/src/components/base-select-mobile/index.ts +0 -1
  354. package/src/desktop.ts +0 -1
  355. package/src/mobile.ts +0 -5
  356. package/src/shared.ts +0 -5
  357. package/typings-89f0cb07.d.ts +0 -93
  358. package/typings-baf4875b.d.ts +0 -52
  359. /package/cssm/{hook-244c8d6e.d.ts → hook-2f9ec939.d.ts} +0 -0
  360. /package/esm/{hook-e63a15d0.d.ts → hook-8209d0d1.d.ts} +0 -0
  361. /package/{hook-74d61833.d.ts → hook-cb17586d.d.ts} +0 -0
  362. /package/modern/{hook-5e1db0b0.d.ts → hook-4a3d365d.d.ts} +0 -0
@@ -1,572 +0,0 @@
1
- import React, {
2
- FocusEvent,
3
- forwardRef,
4
- KeyboardEvent,
5
- MouseEvent,
6
- ReactNode,
7
- useEffect,
8
- useMemo,
9
- useRef,
10
- } from 'react';
11
- import mergeRefs from 'react-merge-refs';
12
- import cn from 'classnames';
13
- import {
14
- useCombobox,
15
- useMultipleSelection,
16
- UseMultipleSelectionProps,
17
- UseMultipleSelectionState,
18
- } from 'downshift';
19
-
20
- import { BottomSheet, BottomSheetProps } from '@alfalab/core-components-bottom-sheet';
21
- import { ModalMobile } from '@alfalab/core-components-modal/mobile';
22
- import { getDataTestId } from '@alfalab/core-components-shared';
23
-
24
- import {
25
- AnyObject,
26
- BaseSelectProps,
27
- OptionProps,
28
- OptionShape,
29
- OptionsListProps,
30
- } from '../../typings';
31
- import { defaultAccessor, defaultFilterFn, processOptions } from '../../utils';
32
- import { Arrow as DefaultArrow } from '../arrow';
33
- import { Field as DefaultField } from '../field';
34
- import { Optgroup as DefaultOptgroup } from '../optgroup';
35
- import { Option as DefaultOption } from '../option';
36
- import { OptionsList as DefaultOptionsList } from '../options-list';
37
- import { Search as DefaultSearch } from '../search';
38
-
39
- import styles from './index.module.css';
40
-
41
- export type SelectMobileProps = Omit<BaseSelectProps, 'Checkmark' | 'onScroll'> & {
42
- /**
43
- * Футер
44
- * @deprecated Используйте bottomSheetProps.actionButton
45
- */
46
- footer?: ReactNode;
47
-
48
- /**
49
- * Будет ли свайпаться шторка
50
- * @deprecated Используйте bottomSheetProps.swipeable
51
- */
52
- swipeable?: boolean;
53
-
54
- /**
55
- * Отображать в BottomSheet
56
- */
57
- isBottomSheet?: boolean;
58
-
59
- /**
60
- * Дополнительные пропсы шторки
61
- */
62
- bottomSheetProps?: Partial<BottomSheetProps>;
63
-
64
- /**
65
- * Дополнительные пропсы модалки
66
- */
67
- modalProps?: Partial<React.ComponentProps<typeof ModalMobile>>;
68
-
69
- /**
70
- * Дополнительные пропсы шапки модалки
71
- */
72
- modalHeaderProps?: Partial<React.ComponentProps<typeof ModalMobile.Header>>;
73
-
74
- /**
75
- * Дополнительные пропсы футера модалки
76
- */
77
- modalFooterProps?: Partial<React.ComponentProps<typeof ModalMobile.Footer>>;
78
- };
79
-
80
- export const BaseSelectMobile = forwardRef(
81
- (
82
- {
83
- dataTestId,
84
- className,
85
- fieldClassName,
86
- optionsListClassName,
87
- optionClassName,
88
- optionGroupClassName,
89
- optionsListProps,
90
- options = [],
91
- autocomplete = false,
92
- multiple = false,
93
- allowUnselect = false,
94
- disabled = false,
95
- closeOnSelect = !multiple,
96
- circularNavigation = false,
97
- defaultOpen = false,
98
- open: openProp,
99
- optionsListWidth = 'content',
100
- name,
101
- id,
102
- selected = [],
103
- size = 'm',
104
- optionsSize = 'm',
105
- error,
106
- hint,
107
- block,
108
- label,
109
- labelView,
110
- placeholder,
111
- fieldProps = {},
112
- optionProps = {},
113
- searchProps = {},
114
- showSearch = false,
115
- valueRenderer,
116
- onChange,
117
- onOpen,
118
- onFocus,
119
- onBlur,
120
- Arrow = DefaultArrow,
121
- Field = DefaultField,
122
- Optgroup = DefaultOptgroup,
123
- Option = DefaultOption,
124
- OptionsList = DefaultOptionsList,
125
- Search = DefaultSearch,
126
- swipeable,
127
- footer,
128
- isBottomSheet,
129
- bottomSheetProps,
130
- modalProps,
131
- modalHeaderProps,
132
- modalFooterProps,
133
- showEmptyOptionsList = false,
134
- }: SelectMobileProps,
135
- ref,
136
- ) => {
137
- const rootRef = useRef<HTMLLabelElement>(null);
138
- const fieldRef = useRef<HTMLInputElement>(null);
139
- const listRef = useRef<HTMLDivElement>(null);
140
- const initiatorRef = useRef<OptionShape | null>(null);
141
- const alreadyClickedRef = useRef<boolean>(false);
142
- const searchRef = useRef<HTMLInputElement>(null);
143
-
144
- const [searchState, setSearchState] = React.useState('');
145
-
146
- const [search, setSearch] =
147
- typeof searchProps?.value === 'string'
148
- ? [searchProps.value, searchProps.onChange]
149
- : [searchState, setSearchState];
150
-
151
- const itemToString = (option: OptionShape) => (option ? option.key : '');
152
-
153
- const accessor = searchProps.accessor || defaultAccessor;
154
-
155
- const { filteredOptions, flatOptions, selectedOptions } = useMemo(
156
- () =>
157
- processOptions(options, selected, (option) =>
158
- defaultFilterFn(accessor(option), search),
159
- ),
160
- [accessor, options, search, selected],
161
- );
162
-
163
- const scrollableContainerRef = useRef<HTMLDivElement>(null);
164
-
165
- const useMultipleSelectionProps: UseMultipleSelectionProps<OptionShape> = {
166
- itemToString,
167
- onSelectedItemsChange: (changes) => {
168
- if (onChange) {
169
- const { selectedItems = [] } = changes;
170
-
171
- onChange({
172
- selectedMultiple: selectedItems,
173
- selected: selectedItems.length ? selectedItems[0] : null,
174
- initiator: initiatorRef.current,
175
- name,
176
- });
177
-
178
- initiatorRef.current = null;
179
- }
180
- },
181
- stateReducer: (state, actionAndChanges) => {
182
- const { type, changes } = actionAndChanges;
183
-
184
- if (
185
- !allowUnselect &&
186
- type === useMultipleSelection.stateChangeTypes.DropdownKeyDownBackspace
187
- ) {
188
- return state;
189
- }
190
-
191
- return changes as UseMultipleSelectionState<OptionShape>;
192
- },
193
- };
194
-
195
- if (selected !== undefined) {
196
- useMultipleSelectionProps.selectedItems = selectedOptions;
197
- }
198
-
199
- const {
200
- selectedItems,
201
- addSelectedItem,
202
- setSelectedItems,
203
- removeSelectedItem,
204
- getDropdownProps,
205
- } = useMultipleSelection(useMultipleSelectionProps);
206
-
207
- const {
208
- isOpen: open,
209
- getMenuProps,
210
- getInputProps,
211
- getItemProps,
212
- getComboboxProps,
213
- getLabelProps,
214
- highlightedIndex,
215
- toggleMenu,
216
- openMenu,
217
- } = useCombobox<OptionShape>({
218
- id,
219
- isOpen: openProp,
220
- circularNavigation,
221
- items: flatOptions,
222
- itemToString,
223
- defaultHighlightedIndex: -1,
224
- onIsOpenChange: ({ isOpen }) => {
225
- if (onOpen) {
226
- /**
227
- * Вызываем обработчик асинхронно.
228
- *
229
- * Иначе при клике вне открытого селекта сначала сработает onOpen, который закроет селект,
230
- * А затем сработает onClick кнопки открытия\закрытия с open=false и в итоге селект откроется снова.
231
- */
232
- setTimeout(() => {
233
- onOpen({
234
- open: isOpen,
235
- name,
236
- });
237
- }, 0);
238
- }
239
-
240
- if (showSearch) {
241
- if (isOpen) {
242
- setTimeout(() => {
243
- searchRef.current?.focus();
244
- // BottomSheet transition duration
245
- }, 500);
246
- } else {
247
- setSearch?.('');
248
- }
249
- }
250
- },
251
- stateReducer: (state, actionAndChanges) => {
252
- const { type, changes } = actionAndChanges;
253
- const { selectedItem } = changes;
254
-
255
- switch (type) {
256
- case useCombobox.stateChangeTypes.InputBlur:
257
- return state;
258
- case useCombobox.stateChangeTypes.InputKeyDownEnter:
259
- case useCombobox.stateChangeTypes.ItemClick:
260
- initiatorRef.current = selectedItem;
261
-
262
- if (selectedItem && !selectedItem.disabled && !alreadyClickedRef.current) {
263
- // TODO!!! Проблема downshift + React 18. ItemClick срабатывает дважды. См https://github.com/downshift-js/downshift/issues/1384
264
- if (React.version.indexOf('18') === 0) {
265
- alreadyClickedRef.current = true;
266
- setTimeout(() => {
267
- alreadyClickedRef.current = false;
268
- });
269
- }
270
- const alreadySelected = selectedItems.includes(selectedItem);
271
- const allowRemove =
272
- allowUnselect || (multiple && selectedItems.length > 1);
273
-
274
- if (alreadySelected && allowRemove) {
275
- if (multiple) {
276
- removeSelectedItem(selectedItem);
277
- } else {
278
- setSelectedItems([]);
279
- }
280
- }
281
-
282
- if (!alreadySelected) {
283
- if (multiple) {
284
- addSelectedItem(selectedItem);
285
- } else {
286
- setSelectedItems([selectedItem]);
287
- }
288
- }
289
- }
290
-
291
- return {
292
- ...changes,
293
- isOpen: !closeOnSelect || multiple,
294
- // при closeOnSelect === false - сохраняем подсвеченный индекс
295
- highlightedIndex:
296
- state.isOpen && !closeOnSelect
297
- ? state.highlightedIndex
298
- : changes.highlightedIndex,
299
- };
300
- default:
301
- return changes;
302
- }
303
- },
304
- });
305
-
306
- const menuProps = (getMenuProps as (options: object, additional: object) => AnyObject)(
307
- { ref: listRef },
308
- { suppressRefError: true },
309
- );
310
- const inputProps = getInputProps(getDropdownProps({ ref: mergeRefs([ref, fieldRef]) }));
311
-
312
- const handleFieldFocus = (event: FocusEvent<HTMLDivElement | HTMLInputElement>) => {
313
- if (onFocus) onFocus(event);
314
-
315
- if (autocomplete && !open) {
316
- openMenu();
317
- }
318
- };
319
-
320
- const handleFieldBlur = (event: FocusEvent<HTMLDivElement | HTMLInputElement>) => {
321
- if (!open && onBlur) onBlur(event);
322
- };
323
-
324
- const handleFieldKeyDown = (event: KeyboardEvent<HTMLDivElement | HTMLInputElement>) => {
325
- inputProps.onKeyDown(event);
326
-
327
- // https://caniuse.com/?search=KeyboardEvent.key
328
- const isKeyUnsupported = event.key === 'Unidentified';
329
-
330
- if (
331
- autocomplete &&
332
- !open &&
333
- (isKeyUnsupported || event.key.length === 1 || event.key === 'Backspace')
334
- ) {
335
- // Для автокомплита - открываем меню при начале ввода
336
- openMenu();
337
- }
338
-
339
- if (
340
- [' ', 'Enter'].includes(event.key) &&
341
- !autocomplete &&
342
- (event.target as HTMLElement).tagName !== 'INPUT' &&
343
- (event.target as HTMLElement).tagName !== 'BUTTON'
344
- ) {
345
- // Открываем\закрываем меню по нажатию enter или пробела
346
- event.preventDefault();
347
- if (!open || highlightedIndex === -1) toggleMenu();
348
- }
349
- };
350
-
351
- const handleFieldClick = (event: MouseEvent) => {
352
- if (!autocomplete || (event.target as HTMLElement).tagName !== 'INPUT') {
353
- toggleMenu();
354
- } else {
355
- openMenu();
356
- }
357
- };
358
-
359
- const getOptionProps = (option: OptionShape, index: number): OptionProps => {
360
- const selectedItem = selectedItems.some(({ key }) => key === option.key);
361
-
362
- return {
363
- ...(optionProps as object),
364
- mobile: true,
365
- className: cn(styles.option, optionClassName),
366
- innerProps: getItemProps({
367
- index,
368
- item: option,
369
- disabled: option.disabled,
370
- onMouseDown: (event: MouseEvent) => event.preventDefault(),
371
- }),
372
- multiple,
373
- index,
374
- option,
375
- size: optionsSize,
376
- disabled: option.disabled,
377
- highlighted: index === highlightedIndex,
378
- selected: selectedItem,
379
- dataTestId: getDataTestId(dataTestId, 'option'),
380
- };
381
- };
382
-
383
- useEffect(() => {
384
- if (defaultOpen) openMenu();
385
- }, [defaultOpen, openMenu]);
386
-
387
- useEffect(() => {
388
- if (openProp) {
389
- openMenu();
390
- }
391
- // eslint-disable-next-line react-hooks/exhaustive-deps
392
- }, []);
393
-
394
- const handleClose = () => {
395
- toggleMenu();
396
- };
397
-
398
- const renderValue = () =>
399
- selectedItems.map((option) => (
400
- <input type='hidden' name={name} value={option.key} key={option.key} />
401
- ));
402
-
403
- const renderSearch = () =>
404
- showSearch && (
405
- <Search
406
- {...searchProps?.componentProps}
407
- value={search}
408
- onChange={(_, payload) => setSearch?.(payload.value)}
409
- dataTestId={getDataTestId(dataTestId, 'search')}
410
- onClear={() => setSearch?.('')}
411
- className={styles.search}
412
- ref={searchRef}
413
- />
414
- );
415
-
416
- const { emptyPlaceholder } = optionsListProps as OptionsListProps;
417
-
418
- const renderEmptyPlaceholder = () => {
419
- if (emptyPlaceholder) {
420
- return emptyPlaceholder;
421
- }
422
-
423
- if (showSearch) {
424
- return <div className={styles.emptySearchPlaceholder}>Ничего не нашлось</div>;
425
- }
426
-
427
- return undefined;
428
- };
429
-
430
- const renderOptionsList = () => {
431
- if (flatOptions.length === 0 && !showEmptyOptionsList && !showSearch) return null;
432
-
433
- return (
434
- <div {...menuProps} className={cn(styles.optionsListWrapper, optionsListClassName)}>
435
- <OptionsList
436
- {...(optionsListProps as OptionsListProps)}
437
- ref={scrollableContainerRef}
438
- className={styles.optionsList}
439
- scrollbarClassName={styles.scrollbar}
440
- optionsListWidth={optionsListWidth}
441
- flatOptions={flatOptions}
442
- highlightedIndex={highlightedIndex}
443
- open={open}
444
- size={size}
445
- options={filteredOptions}
446
- Optgroup={Optgroup}
447
- Option={Option}
448
- selectedItems={selectedItems}
449
- setSelectedItems={setSelectedItems}
450
- toggleMenu={toggleMenu}
451
- getOptionProps={getOptionProps}
452
- visibleOptions={0}
453
- dataTestId={getDataTestId(dataTestId, 'options-list')}
454
- optionGroupClassName={cn(styles.optionGroup, optionGroupClassName)}
455
- emptyPlaceholder={renderEmptyPlaceholder()}
456
- />
457
- </div>
458
- );
459
- };
460
-
461
- return (
462
- <div
463
- {...getComboboxProps({
464
- ref: rootRef,
465
- ...(disabled && { 'aria-disabled': true }),
466
- className: cn(styles.component, { [styles.block]: block }, className),
467
- })}
468
- onKeyDown={disabled ? undefined : handleFieldKeyDown}
469
- tabIndex={-1}
470
- data-test-id={getDataTestId(dataTestId)}
471
- >
472
- <Field
473
- selectedMultiple={selectedItems}
474
- selected={selectedItems[0]}
475
- setSelectedItems={setSelectedItems}
476
- toggleMenu={toggleMenu}
477
- multiple={multiple}
478
- open={open}
479
- disabled={disabled}
480
- size={size}
481
- placeholder={placeholder}
482
- label={label && <span {...getLabelProps()}>{label}</span>}
483
- labelView={labelView}
484
- Arrow={Arrow && <Arrow open={open} />}
485
- error={error}
486
- hint={hint}
487
- valueRenderer={valueRenderer}
488
- className={fieldClassName}
489
- innerProps={{
490
- onBlur: handleFieldBlur,
491
- onFocus: disabled ? undefined : handleFieldFocus,
492
- onClick: disabled ? undefined : handleFieldClick,
493
- tabIndex: disabled ? -1 : 0,
494
- ref: mergeRefs([inputProps.ref]),
495
- id: inputProps.id,
496
- 'aria-labelledby': inputProps['aria-labelledby'],
497
- 'aria-controls': inputProps['aria-controls'],
498
- 'aria-autocomplete': autocomplete
499
- ? inputProps['aria-autocomplete']
500
- : undefined,
501
- }}
502
- dataTestId={getDataTestId(dataTestId, 'field')}
503
- {...(fieldProps as AnyObject)}
504
- />
505
-
506
- {name && renderValue()}
507
-
508
- {isBottomSheet ? (
509
- <BottomSheet
510
- open={open}
511
- onClose={handleClose}
512
- className={styles.sheet}
513
- contentClassName={styles.sheetContent}
514
- containerClassName={styles.sheetContainer}
515
- title={label || placeholder}
516
- actionButton={footer}
517
- stickyHeader={true}
518
- hasCloser={true}
519
- swipeable={swipeable}
520
- scrollableContainerRef={scrollableContainerRef}
521
- initialHeight={showSearch ? 'full' : 'default'}
522
- {...bottomSheetProps}
523
- bottomAddons={
524
- <React.Fragment>
525
- {renderSearch()}
526
- {bottomSheetProps?.bottomAddons}
527
- </React.Fragment>
528
- }
529
- >
530
- {renderOptionsList()}
531
- </BottomSheet>
532
- ) : (
533
- <ModalMobile
534
- open={open}
535
- hasCloser={true}
536
- {...modalProps}
537
- onClose={(...args) => {
538
- handleClose();
539
- modalProps?.onClose?.(...args);
540
- }}
541
- contentClassName={cn(styles.sheetContent, modalProps?.contentClassName)}
542
- ref={mergeRefs([
543
- scrollableContainerRef,
544
- modalProps?.ref as React.Ref<HTMLDivElement>,
545
- ])}
546
- >
547
- <ModalMobile.Header
548
- hasCloser={true}
549
- sticky={true}
550
- {...modalHeaderProps}
551
- title={undefined}
552
- bottomAddons={
553
- <React.Fragment>
554
- {renderSearch()}
555
- {modalHeaderProps?.bottomAddons}
556
- </React.Fragment>
557
- }
558
- >
559
- {modalHeaderProps?.title || label || placeholder}
560
- </ModalMobile.Header>
561
-
562
- <ModalMobile.Content flex={true} className={styles.modalContent}>
563
- {renderOptionsList()}
564
- </ModalMobile.Content>
565
-
566
- {modalFooterProps?.children && <ModalMobile.Footer {...modalFooterProps} />}
567
- </ModalMobile>
568
- )}
569
- </div>
570
- );
571
- },
572
- );
@@ -1 +0,0 @@
1
- export * from './Component';
@@ -1 +0,0 @@
1
- export * from './Component';
package/src/desktop.ts DELETED
@@ -1 +0,0 @@
1
- export { SelectDesktop, SelectDesktopProps } from './Component.desktop';
package/src/mobile.ts DELETED
@@ -1,5 +0,0 @@
1
- export { SelectMobile } from './Component.mobile';
2
- export { SelectModalMobile } from './Component.modal.mobile';
3
-
4
- export type { SelectMobileProps } from './Component.mobile';
5
- export type { SelectModalMobileProps } from './Component.modal.mobile';
package/src/shared.ts DELETED
@@ -1,5 +0,0 @@
1
- export * from './components';
2
- export * from './presets';
3
- export * from './typings';
4
- export * from './utils';
5
- export type { AdditionalMobileProps } from './Component.mobile';
@@ -1,93 +0,0 @@
1
- import { AnchorHTMLAttributes, ButtonHTMLAttributes, ElementType, ReactNode } from 'react';
2
- type StyleColors = {
3
- default: {
4
- [key: string]: string;
5
- };
6
- inverted: {
7
- [key: string]: string;
8
- };
9
- };
10
- type ComponentProps = {
11
- /**
12
- * Тип кнопки
13
- * @default secondary
14
- */
15
- view?: 'accent' | 'primary' | 'secondary' | 'tertiary' | 'outlined' | 'filled' | 'transparent' | 'link' | 'ghost';
16
- /**
17
- * Слот слева
18
- */
19
- leftAddons?: ReactNode;
20
- /**
21
- * Слот справа
22
- */
23
- rightAddons?: ReactNode;
24
- /**
25
- * Размер компонента
26
- * @default m
27
- */
28
- size?: 'xxs' | 'xs' | 's' | 'm' | 'l' | 'xl';
29
- /**
30
- * Растягивает компонент на ширину контейнера
31
- * @default false
32
- */
33
- block?: boolean;
34
- /**
35
- * Дополнительный класс
36
- */
37
- className?: string;
38
- /**
39
- * Дополнительный класс для спиннера
40
- */
41
- spinnerClassName?: string;
42
- /**
43
- * Выводит ссылку в виде кнопки
44
- */
45
- href?: string;
46
- /**
47
- * Позволяет использовать кастомный компонент для кнопки (например Link из роутера)
48
- */
49
- Component?: ElementType;
50
- /**
51
- * Идентификатор для систем автоматизированного тестирования
52
- */
53
- dataTestId?: string;
54
- /**
55
- * Показать лоадер
56
- * @default false
57
- */
58
- loading?: boolean;
59
- /**
60
- * Не переносить текст кнопки на новую строку
61
- * @default false
62
- */
63
- nowrap?: boolean;
64
- /**
65
- * Набор цветов для компонента
66
- */
67
- colors?: 'default' | 'inverted';
68
- /**
69
- * Дочерние элементы.
70
- */
71
- children?: ReactNode;
72
- };
73
- type PrivateButtonProps = {
74
- /**
75
- * Основные стили компонента.
76
- */
77
- styles: {
78
- [key: string]: string;
79
- };
80
- /**
81
- * Стили компонента для default и inverted режима.
82
- */
83
- colorStylesMap: StyleColors;
84
- };
85
- type CommonButtonProps = ComponentProps & Partial<AnchorHTMLAttributes<HTMLAnchorElement> | ButtonHTMLAttributes<HTMLButtonElement>>;
86
- type ButtonProps = CommonButtonProps & {
87
- /**
88
- * Контрольная точка, с нее начинается desktop версия
89
- * @default 1024
90
- */
91
- breakpoint?: number;
92
- };
93
- export { StyleColors, ComponentProps, PrivateButtonProps, CommonButtonProps, ButtonProps };