@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,9 +1,12 @@
1
1
  /* eslint-disable no-nested-ternary */
2
2
  import React, {
3
+ FC,
3
4
  FocusEvent,
4
5
  forwardRef,
6
+ ForwardRefExoticComponent,
5
7
  KeyboardEvent,
6
8
  MouseEvent,
9
+ RefAttributes,
7
10
  useCallback,
8
11
  useEffect,
9
12
  useMemo,
@@ -12,6 +15,7 @@ import React, {
12
15
  import mergeRefs from 'react-merge-refs';
13
16
  import { ResizeObserver as ResizeObserverPolyfill } from '@juggle/resize-observer';
14
17
  import cn from 'classnames';
18
+ import { compute } from 'compute-scroll-into-view';
15
19
  import {
16
20
  useCombobox,
17
21
  useMultipleSelection,
@@ -19,13 +23,23 @@ import {
19
23
  UseMultipleSelectionState,
20
24
  } from 'downshift';
21
25
 
22
- import { Popover } from '@alfalab/core-components-popover';
23
- import { getDataTestId } from '@alfalab/core-components-shared';
26
+ import type { BottomSheetProps } from '@alfalab/core-components-bottom-sheet';
27
+ import type { ModalMobileProps } from '@alfalab/core-components-modal/mobile';
28
+ import type {
29
+ ModalContentProps,
30
+ ModalFooterProps,
31
+ ModalHeaderProps,
32
+ } from '@alfalab/core-components-modal/shared';
33
+ import type { PopoverProps } from '@alfalab/core-components-popover';
34
+ import { fnUtils, getDataTestId } from '@alfalab/core-components-shared';
24
35
  import { useLayoutEffect_SAFE_FOR_SSR } from '@alfalab/hooks';
25
36
 
26
- import {
37
+ import type {
38
+ AdditionalMobileProps,
27
39
  AnyObject,
28
40
  BaseSelectProps,
41
+ BottomSheetSelectMobileProps,
42
+ ModalSelectMobileProps,
29
43
  OptionShape,
30
44
  OptionsListProps,
31
45
  SearchProps,
@@ -34,6 +48,30 @@ import { defaultAccessor, defaultFilterFn, processOptions } from '../../utils';
34
48
  import { NativeSelect } from '../native-select';
35
49
 
36
50
  import styles from './index.module.css';
51
+ import mobileStyles from './mobile.module.css';
52
+
53
+ type ComponentProps = BaseSelectProps &
54
+ AdditionalMobileProps &
55
+ BottomSheetSelectMobileProps &
56
+ ModalSelectMobileProps & {
57
+ isBottomSheet?: boolean;
58
+ view: 'desktop' | 'mobile';
59
+ Popover?: ForwardRefExoticComponent<PopoverProps & RefAttributes<HTMLDivElement>>;
60
+ BottomSheet?: React.ForwardRefExoticComponent<
61
+ BottomSheetProps & React.RefAttributes<HTMLDivElement>
62
+ >;
63
+ ModalMobile?: ForwardRefExoticComponent<
64
+ ModalMobileProps & RefAttributes<HTMLDivElement>
65
+ > & {
66
+ Header: FC<ModalHeaderProps>;
67
+ Footer: FC<ModalFooterProps>;
68
+ Content: FC<ModalContentProps>;
69
+ };
70
+ };
71
+
72
+ const itemToString = (option: OptionShape | null) => (option ? option.key : '');
73
+
74
+ const isItemDisabled = (option: OptionShape | null) => Boolean(option?.disabled);
37
75
 
38
76
  export const BaseSelect = forwardRef(
39
77
  // TODO: 😭
@@ -43,6 +81,7 @@ export const BaseSelect = forwardRef(
43
81
  dataTestId,
44
82
  className,
45
83
  fieldClassName,
84
+ optionGroupClassName,
46
85
  optionsListClassName,
47
86
  optionClassName,
48
87
  popperClassName,
@@ -91,14 +130,27 @@ export const BaseSelect = forwardRef(
91
130
  zIndexPopover,
92
131
  showEmptyOptionsList = false,
93
132
  visibleOptions,
94
- }: BaseSelectProps,
133
+ view,
134
+ isBottomSheet = true,
135
+ footer,
136
+ swipeable,
137
+ modalProps,
138
+ modalFooterProps,
139
+ modalHeaderProps,
140
+ bottomSheetProps,
141
+ Popover,
142
+ ModalMobile,
143
+ BottomSheet,
144
+ }: ComponentProps,
95
145
  ref,
96
146
  ) => {
97
- const rootRef = useRef<HTMLLabelElement>(null);
147
+ const rootRef = useRef<HTMLDivElement>(null);
98
148
  const fieldRef = useRef<HTMLInputElement>(null);
99
149
  const listRef = useRef<HTMLDivElement>(null);
100
150
  const initiatorRef = useRef<OptionShape | null>(null);
101
151
  const searchRef = useRef<HTMLInputElement>(null);
152
+ const alreadyClickedRef = useRef<boolean>(false);
153
+ const scrollableContainerRef = useRef<HTMLDivElement>(null);
102
154
 
103
155
  const [searchState, setSearchState] = React.useState('');
104
156
 
@@ -107,18 +159,32 @@ export const BaseSelect = forwardRef(
107
159
  ? [searchProps.value, searchProps.onChange]
108
160
  : [searchState, setSearchState];
109
161
 
110
- const itemToString = (option: OptionShape) => (option ? option.key : '');
111
-
112
162
  const accessor = searchProps.accessor || defaultAccessor;
163
+ const filterFn = searchProps.filterFn || defaultFilterFn;
113
164
 
114
165
  const { filteredOptions, flatOptions, selectedOptions } = useMemo(
115
- () =>
116
- processOptions(options, selected, (option) =>
117
- defaultFilterFn(accessor(option), search),
118
- ),
119
- [accessor, options, search, selected],
166
+ () => processOptions(options, selected, (option) => filterFn(accessor(option), search)),
167
+ [filterFn, accessor, options, search, selected],
120
168
  );
121
169
 
170
+ const scrollIntoView = (node: HTMLElement) => {
171
+ if (!node || view === 'mobile') return;
172
+
173
+ requestAnimationFrame(() => {
174
+ const actions = compute(node, {
175
+ boundary: listRef.current,
176
+ block: 'nearest',
177
+ scrollMode: 'if-needed',
178
+ });
179
+
180
+ actions.forEach((action) => {
181
+ const { el, top } = action;
182
+
183
+ el.scrollTop = top;
184
+ });
185
+ });
186
+ };
187
+
122
188
  const useMultipleSelectionProps: UseMultipleSelectionProps<OptionShape> = {
123
189
  itemToString,
124
190
  onSelectedItemsChange: (changes) => {
@@ -166,19 +232,20 @@ export const BaseSelect = forwardRef(
166
232
  getMenuProps,
167
233
  getInputProps,
168
234
  getItemProps,
169
- getComboboxProps,
170
235
  getLabelProps,
171
236
  highlightedIndex,
172
237
  toggleMenu,
173
238
  openMenu,
239
+ closeMenu,
174
240
  setHighlightedIndex,
175
241
  } = useCombobox<OptionShape>({
176
242
  id,
177
243
  isOpen: openProp,
178
- circularNavigation,
179
244
  items: flatOptions,
180
245
  itemToString,
246
+ isItemDisabled,
181
247
  defaultHighlightedIndex: selectedItems.length === 0 ? -1 : undefined,
248
+ scrollIntoView,
182
249
  onIsOpenChange: (changes) => {
183
250
  if (onOpen) {
184
251
  /**
@@ -196,7 +263,7 @@ export const BaseSelect = forwardRef(
196
263
  }
197
264
 
198
265
  if (showSearch) {
199
- if (changes.isOpen) {
266
+ if (changes.isOpen && view === 'desktop') {
200
267
  setTimeout(() => {
201
268
  searchRef.current?.focus();
202
269
  }, 0);
@@ -205,16 +272,44 @@ export const BaseSelect = forwardRef(
205
272
  }
206
273
  }
207
274
  },
275
+ // eslint-disable-next-line complexity
208
276
  stateReducer: (state, actionAndChanges) => {
209
277
  const { type, changes } = actionAndChanges;
210
278
  const { selectedItem } = changes;
211
279
 
212
280
  switch (type) {
281
+ case useCombobox.stateChangeTypes.InputBlur:
282
+ if (view === 'mobile') {
283
+ return state;
284
+ }
285
+
286
+ return changes;
287
+ case useCombobox.stateChangeTypes.InputKeyDownArrowDown:
288
+ if (!circularNavigation && state.highlightedIndex === options.length - 1) {
289
+ return { ...changes, highlightedIndex: state.highlightedIndex };
290
+ }
291
+
292
+ return changes;
293
+ case useCombobox.stateChangeTypes.InputKeyDownArrowUp:
294
+ if (!circularNavigation && state.highlightedIndex === 0) {
295
+ return { ...changes, highlightedIndex: state.highlightedIndex };
296
+ }
297
+
298
+ return changes;
299
+
213
300
  case useCombobox.stateChangeTypes.InputKeyDownEnter:
214
301
  case useCombobox.stateChangeTypes.ItemClick:
215
- initiatorRef.current = selectedItem;
302
+ initiatorRef.current = selectedItem || null;
303
+
304
+ if (selectedItem && !selectedItem.disabled && !alreadyClickedRef.current) {
305
+ // TODO!!! Проблема downshift + React 18. ItemClick срабатывает дважды. См https://github.com/downshift-js/downshift/issues/1384
306
+ if (view === 'mobile' && React.version.indexOf('18') === 0) {
307
+ alreadyClickedRef.current = true;
308
+ setTimeout(() => {
309
+ alreadyClickedRef.current = false;
310
+ });
311
+ }
216
312
 
217
- if (selectedItem && !selectedItem.disabled) {
218
313
  const alreadySelected = selectedItems.includes(selectedItem);
219
314
  const allowRemove =
220
315
  allowUnselect || (multiple && selectedItems.length > 1);
@@ -234,7 +329,7 @@ export const BaseSelect = forwardRef(
234
329
 
235
330
  return {
236
331
  ...changes,
237
- isOpen: !closeOnSelect,
332
+ isOpen: !closeOnSelect || (view === 'mobile' && multiple),
238
333
  // при closeOnSelect === false - сохраняем подсвеченный индекс
239
334
  highlightedIndex:
240
335
  state.isOpen && !closeOnSelect
@@ -247,12 +342,19 @@ export const BaseSelect = forwardRef(
247
342
  },
248
343
  });
249
344
 
250
- const menuProps = (getMenuProps as (options: object, additional: object) => AnyObject)(
251
- { ref: listRef },
252
- { suppressRefError: true },
253
- );
345
+ const menuProps = getMenuProps({ ref: listRef }, { suppressRefError: true });
254
346
  const inputProps = getInputProps(getDropdownProps({ ref: mergeRefs([ref, fieldRef]) }));
255
347
 
348
+ const handleEntered = (node: HTMLElement, isAppearing: boolean) => {
349
+ if (showSearch) searchRef.current?.focus();
350
+
351
+ if (isBottomSheet) {
352
+ bottomSheetProps?.transitionProps?.onEntered?.(node, isAppearing);
353
+ } else {
354
+ modalProps?.transitionProps?.onEntered?.(node, isAppearing);
355
+ }
356
+ };
357
+
256
358
  const handleFieldFocus = (event: FocusEvent<HTMLDivElement | HTMLInputElement>) => {
257
359
  if (onFocus) onFocus(event);
258
360
 
@@ -262,19 +364,23 @@ export const BaseSelect = forwardRef(
262
364
  };
263
365
 
264
366
  const handleFieldBlur = (event: FocusEvent<HTMLDivElement | HTMLInputElement>) => {
265
- const isNextFocusInsideList = listRef.current?.contains(
266
- (event.relatedTarget || document.activeElement) as HTMLElement,
267
- );
367
+ if (view === 'desktop') {
368
+ const isNextFocusInsideList = listRef.current?.contains(
369
+ (event.relatedTarget || document.activeElement) as HTMLElement,
370
+ );
268
371
 
269
- if (!isNextFocusInsideList) {
270
- if (onBlur) onBlur(event);
372
+ if (!isNextFocusInsideList) {
373
+ if (onBlur) onBlur(event);
271
374
 
272
- inputProps.onBlur(event);
375
+ inputProps.onBlur?.(event);
376
+ }
273
377
  }
378
+
379
+ if (view === 'mobile' && !open && onBlur) onBlur(event);
274
380
  };
275
381
 
276
382
  const handleFieldKeyDown = (event: KeyboardEvent<HTMLDivElement | HTMLInputElement>) => {
277
- inputProps.onKeyDown(event);
383
+ inputProps.onKeyDown?.(event);
278
384
 
279
385
  // https://caniuse.com/?search=KeyboardEvent.key
280
386
  const isKeyUnsupported = event.key === 'Unidentified';
@@ -323,36 +429,26 @@ export const BaseSelect = forwardRef(
323
429
  [flatOptions, setSelectedItems],
324
430
  );
325
431
 
326
- const getOptionProps = useCallback(
327
- (option: OptionShape, index: number) => ({
328
- ...(optionProps as object),
329
- className: optionClassName,
330
- innerProps: getItemProps({
331
- index,
332
- item: option,
333
- disabled: option.disabled,
334
- onMouseDown: (event: MouseEvent) => event.preventDefault(),
335
- }),
336
- multiple,
432
+ const getOptionProps = (option: OptionShape, index: number) => ({
433
+ ...(optionProps as object),
434
+ mobile: view === 'mobile',
435
+ className: cn(optionClassName, {
436
+ [mobileStyles.option]: view === 'mobile',
437
+ }),
438
+ innerProps: getItemProps({
337
439
  index,
338
- option,
339
- size: optionsSize,
340
- disabled: option.disabled,
341
- highlighted: index === highlightedIndex,
342
- selected: selectedItems.some(({ key }) => key === option.key),
343
- dataTestId: getDataTestId(dataTestId, 'option'),
440
+ item: option,
441
+ onMouseDown: (event: MouseEvent) => event.preventDefault(),
344
442
  }),
345
- [
346
- dataTestId,
347
- getItemProps,
348
- highlightedIndex,
349
- multiple,
350
- optionClassName,
351
- optionProps,
352
- optionsSize,
353
- selectedItems,
354
- ],
355
- );
443
+ multiple,
444
+ index,
445
+ option,
446
+ size: optionsSize,
447
+ disabled: option.disabled,
448
+ highlighted: index === highlightedIndex,
449
+ selected: selectedItems.some(({ key }) => key === option.key),
450
+ dataTestId: getDataTestId(dataTestId, 'option'),
451
+ });
356
452
 
357
453
  useEffect(() => {
358
454
  if (defaultOpen) openMenu();
@@ -366,7 +462,7 @@ export const BaseSelect = forwardRef(
366
462
  }, []);
367
463
 
368
464
  const calcOptionsListWidth = useCallback(() => {
369
- if (listRef.current) {
465
+ if (view === 'desktop' && listRef.current) {
370
466
  const widthAttr = optionsListWidth === 'field' ? 'width' : 'minWidth';
371
467
 
372
468
  const optionsListMinWidth = rootRef.current
@@ -376,20 +472,24 @@ export const BaseSelect = forwardRef(
376
472
  listRef.current.setAttribute('style', '');
377
473
  listRef.current.style[widthAttr] = `${optionsListMinWidth}px`;
378
474
  }
379
- }, [optionsListWidth]);
475
+ }, [view, optionsListWidth]);
380
476
 
381
477
  useEffect(() => {
382
- const ResizeObserver = window.ResizeObserver || ResizeObserverPolyfill;
383
- const observer = new ResizeObserver(calcOptionsListWidth);
478
+ if (view === 'desktop') {
479
+ const ResizeObserver = window.ResizeObserver || ResizeObserverPolyfill;
480
+ const observer = new ResizeObserver(calcOptionsListWidth);
481
+
482
+ if (rootRef.current) {
483
+ observer.observe(rootRef.current);
484
+ }
384
485
 
385
- if (rootRef.current) {
386
- observer.observe(rootRef.current);
486
+ return () => {
487
+ observer.disconnect();
488
+ };
387
489
  }
388
490
 
389
- return () => {
390
- observer.disconnect();
391
- };
392
- }, [calcOptionsListWidth, open, optionsListWidth]);
491
+ return fnUtils.noop;
492
+ }, [view, calcOptionsListWidth, open, optionsListWidth]);
393
493
 
394
494
  useLayoutEffect_SAFE_FOR_SSR(calcOptionsListWidth, [
395
495
  open,
@@ -398,22 +498,19 @@ export const BaseSelect = forwardRef(
398
498
  selectedItems,
399
499
  ]);
400
500
 
401
- const renderValue = useCallback(
402
- () =>
403
- selectedItems.map((option) => (
404
- <input type='hidden' name={name} value={option.key} key={option.key} />
405
- )),
406
- [selectedItems, name],
407
- );
501
+ const renderValue = () =>
502
+ selectedItems.map((option) => (
503
+ <input type='hidden' name={name} value={option.key} key={option.key} />
504
+ ));
408
505
 
409
- const renderNativeSelect = useCallback(() => {
506
+ const renderNativeSelect = () => {
410
507
  const value = multiple
411
508
  ? selectedItems.map((option) => option.key)
412
509
  : (selectedItems[0] || {}).key;
413
510
 
414
511
  return (
415
512
  <NativeSelect
416
- {...menuProps}
513
+ {...(menuProps as AnyObject)}
417
514
  className={styles.nativeSelect}
418
515
  disabled={disabled}
419
516
  multiple={multiple}
@@ -423,22 +520,10 @@ export const BaseSelect = forwardRef(
423
520
  options={filteredOptions}
424
521
  />
425
522
  );
426
- }, [
427
- multiple,
428
- selectedItems,
429
- disabled,
430
- name,
431
- handleNativeSelectChange,
432
- filteredOptions,
433
- menuProps,
434
- ]);
523
+ };
435
524
 
436
- const { header, emptyPlaceholder } = optionsListProps as OptionsListProps;
437
-
438
- const renderOptionsListHeader = () => {
439
- if (!showSearch && !header) {
440
- return null;
441
- }
525
+ const renderSearch = () => {
526
+ if (!showSearch) return null;
442
527
 
443
528
  const handleClear: SearchProps['onClear'] = (event) => {
444
529
  setSearch?.('');
@@ -451,26 +536,37 @@ export const BaseSelect = forwardRef(
451
536
  };
452
537
 
453
538
  return (
454
- <React.Fragment>
455
- {header}
456
- {showSearch && (
457
- <Search
458
- {...searchProps?.componentProps}
459
- value={search}
460
- onChange={handleChange}
461
- dataTestId={getDataTestId(dataTestId, 'search')}
462
- onClear={handleClear}
463
- className={cn(styles.search, searchProps?.componentProps?.className)}
464
- ref={searchRef}
465
- />
466
- )}
467
- </React.Fragment>
539
+ <Search
540
+ {...searchProps?.componentProps}
541
+ value={search}
542
+ onChange={handleChange}
543
+ dataTestId={getDataTestId(dataTestId, 'search')}
544
+ onClear={handleClear}
545
+ className={cn(searchProps?.componentProps?.className, {
546
+ [styles.search]: view === 'desktop',
547
+ [mobileStyles.search]: view === 'mobile',
548
+ })}
549
+ ref={mergeRefs([searchRef, searchProps?.componentProps?.ref || null])}
550
+ />
468
551
  );
469
552
  };
470
553
 
471
- const needRenderOptionsList = flatOptions.length > 0 || showEmptyOptionsList || showSearch;
554
+ const { header, emptyPlaceholder } = optionsListProps as OptionsListProps;
555
+
556
+ const renderOptionsListHeader = () => {
557
+ if (header || (view === 'desktop' && showSearch)) {
558
+ return (
559
+ <React.Fragment>
560
+ {header}
561
+ {view === 'desktop' && renderSearch()}
562
+ </React.Fragment>
563
+ );
564
+ }
565
+
566
+ return null;
567
+ };
472
568
 
473
- const renderEmptyPlaceholder = useCallback(() => {
569
+ const renderEmptyPlaceholder = () => {
474
570
  if (emptyPlaceholder) {
475
571
  return emptyPlaceholder;
476
572
  }
@@ -480,15 +576,182 @@ export const BaseSelect = forwardRef(
480
576
  }
481
577
 
482
578
  return undefined;
483
- }, [emptyPlaceholder, showSearch]);
579
+ };
580
+
581
+ const renderOptionsList = () => {
582
+ if (flatOptions.length === 0 && !showEmptyOptionsList && !showSearch) return null;
583
+
584
+ const listProps = optionsListProps as OptionsListProps & RefAttributes<HTMLDivElement>;
585
+
586
+ return (
587
+ <div
588
+ {...menuProps}
589
+ className={cn(
590
+ optionsListClassName,
591
+ view === 'mobile' && mobileStyles.optionsListWrapper,
592
+ view === 'desktop' && styles.optionsListWrapper,
593
+ )}
594
+ >
595
+ <OptionsList
596
+ {...listProps}
597
+ ref={view === 'desktop' ? listProps.ref : scrollableContainerRef}
598
+ setHighlightedIndex={view === 'desktop' ? setHighlightedIndex : undefined}
599
+ className={cn({ [mobileStyles.optionsList]: view === 'mobile' })}
600
+ scrollbarClassName={cn({ [mobileStyles.scrollbar]: view === 'mobile' })}
601
+ optionsListWidth={optionsListWidth}
602
+ flatOptions={flatOptions}
603
+ highlightedIndex={highlightedIndex}
604
+ open={open}
605
+ size={size}
606
+ options={filteredOptions}
607
+ Optgroup={Optgroup}
608
+ Option={Option}
609
+ selectedItems={selectedItems}
610
+ setSelectedItems={setSelectedItems}
611
+ toggleMenu={toggleMenu}
612
+ getOptionProps={getOptionProps}
613
+ visibleOptions={view === 'desktop' ? visibleOptions : 0}
614
+ dataTestId={getDataTestId(dataTestId, 'options-list')}
615
+ header={renderOptionsListHeader()}
616
+ optionGroupClassName={cn(optionGroupClassName, {
617
+ [mobileStyles.optionGroup]: view === 'mobile',
618
+ })}
619
+ emptyPlaceholder={renderEmptyPlaceholder()}
620
+ onScroll={onScroll}
621
+ />
622
+ {view === 'desktop' && <div className={styles.optionsListBorder} />}
623
+ </div>
624
+ );
625
+ };
626
+
627
+ const renderInPopover = () => {
628
+ if (!nativeSelect && Popover) {
629
+ return (
630
+ <Popover
631
+ open={open}
632
+ withTransition={false}
633
+ anchorElement={fieldRef.current as HTMLElement}
634
+ position={popoverPosition}
635
+ preventFlip={preventFlip}
636
+ popperClassName={cn(styles.popoverInner, popperClassName)}
637
+ update={updatePopover}
638
+ zIndex={zIndexPopover}
639
+ >
640
+ {renderOptionsList()}
641
+ </Popover>
642
+ );
643
+ }
644
+
645
+ return null;
646
+ };
647
+
648
+ const renderInBottomSheet = () => {
649
+ if (!nativeSelect && BottomSheet) {
650
+ return (
651
+ <BottomSheet
652
+ dataTestId={getDataTestId(dataTestId, 'bottom-sheet')}
653
+ open={open}
654
+ className={mobileStyles.sheet}
655
+ contentClassName={mobileStyles.sheetContent}
656
+ containerClassName={mobileStyles.sheetContainer}
657
+ title={label || placeholder}
658
+ actionButton={footer}
659
+ stickyHeader={true}
660
+ hasCloser={true}
661
+ swipeable={swipeable}
662
+ initialHeight={showSearch ? 'full' : 'default'}
663
+ {...bottomSheetProps}
664
+ scrollableContainerRef={scrollableContainerRef}
665
+ onClose={() => {
666
+ closeMenu();
667
+ bottomSheetProps?.onClose?.();
668
+ }}
669
+ transitionProps={{
670
+ ...bottomSheetProps?.transitionProps,
671
+ onEntered: handleEntered,
672
+ }}
673
+ bottomAddons={
674
+ <React.Fragment>
675
+ {renderSearch()}
676
+ {bottomSheetProps?.bottomAddons}
677
+ </React.Fragment>
678
+ }
679
+ containerProps={{
680
+ ...bottomSheetProps?.containerProps,
681
+ onScroll,
682
+ }}
683
+ >
684
+ {renderOptionsList()}
685
+ </BottomSheet>
686
+ );
687
+ }
688
+
689
+ return null;
690
+ };
691
+
692
+ const renderInModalMobile = () => {
693
+ if (!nativeSelect && ModalMobile) {
694
+ return (
695
+ <ModalMobile
696
+ open={open}
697
+ hasCloser={true}
698
+ {...modalProps}
699
+ onClose={(...args) => {
700
+ closeMenu();
701
+ modalProps?.onClose?.(...args);
702
+ }}
703
+ contentClassName={cn(
704
+ mobileStyles.sheetContent,
705
+ modalProps?.contentClassName,
706
+ )}
707
+ ref={mergeRefs([
708
+ scrollableContainerRef,
709
+ modalProps?.ref as React.Ref<HTMLDivElement>,
710
+ ])}
711
+ wrapperProps={{
712
+ ...modalProps?.wrapperProps,
713
+ onScroll,
714
+ }}
715
+ transitionProps={{
716
+ ...modalProps?.transitionProps,
717
+ onEntered: handleEntered,
718
+ }}
719
+ >
720
+ <ModalMobile.Header
721
+ hasCloser={true}
722
+ sticky={true}
723
+ {...modalHeaderProps}
724
+ title={undefined}
725
+ bottomAddons={
726
+ <React.Fragment>
727
+ {renderSearch()}
728
+ {modalHeaderProps?.bottomAddons}
729
+ </React.Fragment>
730
+ }
731
+ >
732
+ {modalHeaderProps?.title || label || placeholder}
733
+ </ModalMobile.Header>
734
+
735
+ <ModalMobile.Content flex={true} className={mobileStyles.modalContent}>
736
+ {renderOptionsList()}
737
+ </ModalMobile.Content>
738
+
739
+ {modalFooterProps?.children && <ModalMobile.Footer {...modalFooterProps} />}
740
+ </ModalMobile>
741
+ );
742
+ }
743
+
744
+ return null;
745
+ };
484
746
 
485
747
  return (
486
748
  <div
487
- {...getComboboxProps({
488
- ref: rootRef,
489
- ...(disabled && { 'aria-disabled': true }),
490
- className: cn(styles.component, { [styles.block]: block }, className),
491
- })}
749
+ {...(disabled && { 'aria-disabled': true })}
750
+ aria-expanded={inputProps['aria-expanded']}
751
+ aria-haspopup='listbox'
752
+ role={inputProps.role}
753
+ className={cn(styles.component, { [styles.block]: block }, className)}
754
+ ref={rootRef}
492
755
  onKeyDown={disabled ? undefined : handleFieldKeyDown}
493
756
  tabIndex={-1}
494
757
  data-test-id={getDataTestId(dataTestId)}
@@ -517,7 +780,7 @@ export const BaseSelect = forwardRef(
517
780
  onFocus: disabled ? undefined : handleFieldFocus,
518
781
  onClick: disabled ? undefined : handleFieldClick,
519
782
  tabIndex: disabled ? undefined : nativeSelect ? -1 : 0,
520
- ref: mergeRefs([inputProps.ref]),
783
+ ref: inputProps.ref,
521
784
  id: inputProps.id,
522
785
  'aria-labelledby': inputProps['aria-labelledby'],
523
786
  'aria-controls': inputProps['aria-controls'],
@@ -531,48 +794,9 @@ export const BaseSelect = forwardRef(
531
794
 
532
795
  {name && !nativeSelect && renderValue()}
533
796
 
534
- {!nativeSelect && (
535
- <Popover
536
- open={open}
537
- withTransition={false}
538
- anchorElement={fieldRef.current as HTMLElement}
539
- position={popoverPosition}
540
- preventFlip={preventFlip}
541
- popperClassName={cn(styles.popoverInner, popperClassName)}
542
- update={updatePopover}
543
- zIndex={zIndexPopover}
544
- >
545
- {needRenderOptionsList && (
546
- <div
547
- {...menuProps}
548
- className={cn(optionsListClassName, styles.optionsList)}
549
- >
550
- <OptionsList
551
- {...(optionsListProps as AnyObject)}
552
- setHighlightedIndex={setHighlightedIndex}
553
- optionsListWidth={optionsListWidth}
554
- flatOptions={flatOptions}
555
- highlightedIndex={highlightedIndex}
556
- open={open}
557
- size={size}
558
- options={filteredOptions}
559
- Optgroup={Optgroup}
560
- Option={Option}
561
- selectedItems={selectedItems}
562
- setSelectedItems={setSelectedItems}
563
- toggleMenu={toggleMenu}
564
- getOptionProps={getOptionProps}
565
- visibleOptions={visibleOptions}
566
- onScroll={onScroll}
567
- dataTestId={getDataTestId(dataTestId, 'options-list')}
568
- header={renderOptionsListHeader()}
569
- emptyPlaceholder={renderEmptyPlaceholder()}
570
- />
571
- <div className={styles.optionsListBorder} />
572
- </div>
573
- )}
574
- </Popover>
575
- )}
797
+ {view === 'desktop' && renderInPopover()}
798
+ {view === 'mobile' && isBottomSheet && renderInBottomSheet()}
799
+ {view === 'mobile' && !isBottomSheet && renderInModalMobile()}
576
800
  </div>
577
801
  );
578
802
  },