@alfalab/core-components-select 19.1.10 → 19.2.0-alfasans

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 (257) hide show
  1. package/components/arrow/index.css +4 -4
  2. package/components/arrow/index.module.css.js +1 -1
  3. package/components/base-checkmark/index.css +9 -9
  4. package/components/base-checkmark/index.module.css.js +1 -1
  5. package/components/base-option/index.css +19 -17
  6. package/components/base-option/index.module.css.js +1 -1
  7. package/components/base-select/Component.js +36 -49
  8. package/components/base-select/Component.js.map +1 -1
  9. package/components/base-select/index.css +70 -20
  10. package/components/base-select/index.module.css.js +1 -1
  11. package/components/base-select/index.module.css.js.map +1 -1
  12. package/components/base-select/mobile.css +12 -11
  13. package/components/base-select/mobile.module.css.js +1 -1
  14. package/components/base-select/mobile.module.css.js.map +1 -1
  15. package/components/checkmark/index.css +11 -11
  16. package/components/checkmark/index.module.css.js +1 -1
  17. package/components/checkmark-mobile/index.css +6 -6
  18. package/components/checkmark-mobile/index.module.css.js +1 -1
  19. package/components/clear-button/index.css +4 -4
  20. package/components/clear-button/index.module.css.js +1 -1
  21. package/components/field/index.css +22 -18
  22. package/components/field/index.module.css.js +1 -1
  23. package/components/footer/index.css +4 -4
  24. package/components/footer/index.module.css.js +1 -1
  25. package/components/optgroup/index.css +8 -7
  26. package/components/optgroup/index.module.css.js +1 -1
  27. package/components/option/desktop/index.css +28 -22
  28. package/components/option/desktop/index.module.css.js +1 -1
  29. package/components/option/desktop/index.module.css.js.map +1 -1
  30. package/components/option/mobile/index.css +25 -19
  31. package/components/option/mobile/index.module.css.js +1 -1
  32. package/components/option/mobile/index.module.css.js.map +1 -1
  33. package/components/options-list/Component.d.ts +4 -0
  34. package/components/options-list/Component.js +32 -53
  35. package/components/options-list/Component.js.map +1 -1
  36. package/components/options-list/index.css +13 -33
  37. package/components/options-list/index.module.css.js +1 -1
  38. package/components/options-list/index.module.css.js.map +1 -1
  39. package/components/search/index.css +1 -1
  40. package/components/search/index.module.css.js +1 -1
  41. package/components/virtual-options-list/Component.d.ts +4 -0
  42. package/components/virtual-options-list/Component.js +61 -48
  43. package/components/virtual-options-list/Component.js.map +1 -1
  44. package/cssm/components/base-option/index.module.css +5 -3
  45. package/cssm/components/base-select/Component.js +36 -49
  46. package/cssm/components/base-select/Component.js.map +1 -1
  47. package/cssm/components/base-select/index.module.css +61 -11
  48. package/cssm/components/base-select/mobile.module.css +1 -0
  49. package/cssm/components/field/index.module.css +9 -5
  50. package/cssm/components/optgroup/index.module.css +4 -3
  51. package/cssm/components/option/desktop/index.module.css +9 -3
  52. package/cssm/components/option/mobile/index.module.css +9 -3
  53. package/cssm/components/options-list/Component.d.ts +4 -0
  54. package/cssm/components/options-list/Component.js +32 -53
  55. package/cssm/components/options-list/Component.js.map +1 -1
  56. package/cssm/components/options-list/index.module.css +6 -26
  57. package/cssm/components/virtual-options-list/Component.d.ts +4 -0
  58. package/cssm/components/virtual-options-list/Component.js +61 -48
  59. package/cssm/components/virtual-options-list/Component.js.map +1 -1
  60. package/cssm/presets/useSelectWithApply/hook.d.ts +12 -0
  61. package/cssm/presets/useSelectWithApply/options-list-with-apply/Component.d.ts +4 -0
  62. package/cssm/presets/useSelectWithApply/options-list-with-apply/footer/index.module.css +0 -5
  63. package/cssm/presets/useSelectWithApply/options-list-with-apply/header/index.module.css +9 -6
  64. package/cssm/shared/index.js +0 -1
  65. package/cssm/shared/index.js.map +1 -1
  66. package/cssm/typings.d.ts +21 -1
  67. package/cssm/utils.d.ts +1 -6
  68. package/cssm/utils.js +19 -28
  69. package/cssm/utils.js.map +1 -1
  70. package/esm/components/arrow/index.css +4 -4
  71. package/esm/components/arrow/index.module.css.js +1 -1
  72. package/esm/components/base-checkmark/index.css +9 -9
  73. package/esm/components/base-checkmark/index.module.css.js +1 -1
  74. package/esm/components/base-option/index.css +19 -17
  75. package/esm/components/base-option/index.module.css.js +1 -1
  76. package/esm/components/base-select/Component.js +37 -50
  77. package/esm/components/base-select/Component.js.map +1 -1
  78. package/esm/components/base-select/index.css +70 -20
  79. package/esm/components/base-select/index.module.css.js +1 -1
  80. package/esm/components/base-select/index.module.css.js.map +1 -1
  81. package/esm/components/base-select/mobile.css +12 -11
  82. package/esm/components/base-select/mobile.module.css.js +1 -1
  83. package/esm/components/base-select/mobile.module.css.js.map +1 -1
  84. package/esm/components/checkmark/index.css +11 -11
  85. package/esm/components/checkmark/index.module.css.js +1 -1
  86. package/esm/components/checkmark-mobile/index.css +6 -6
  87. package/esm/components/checkmark-mobile/index.module.css.js +1 -1
  88. package/esm/components/clear-button/index.css +4 -4
  89. package/esm/components/clear-button/index.module.css.js +1 -1
  90. package/esm/components/field/index.css +22 -18
  91. package/esm/components/field/index.module.css.js +1 -1
  92. package/esm/components/footer/index.css +4 -4
  93. package/esm/components/footer/index.module.css.js +1 -1
  94. package/esm/components/optgroup/index.css +8 -7
  95. package/esm/components/optgroup/index.module.css.js +1 -1
  96. package/esm/components/option/desktop/index.css +28 -22
  97. package/esm/components/option/desktop/index.module.css.js +1 -1
  98. package/esm/components/option/desktop/index.module.css.js.map +1 -1
  99. package/esm/components/option/mobile/index.css +25 -19
  100. package/esm/components/option/mobile/index.module.css.js +1 -1
  101. package/esm/components/option/mobile/index.module.css.js.map +1 -1
  102. package/esm/components/options-list/Component.d.ts +4 -0
  103. package/esm/components/options-list/Component.js +33 -54
  104. package/esm/components/options-list/Component.js.map +1 -1
  105. package/esm/components/options-list/index.css +13 -33
  106. package/esm/components/options-list/index.module.css.js +1 -1
  107. package/esm/components/options-list/index.module.css.js.map +1 -1
  108. package/esm/components/search/index.css +1 -1
  109. package/esm/components/search/index.module.css.js +1 -1
  110. package/esm/components/virtual-options-list/Component.d.ts +4 -0
  111. package/esm/components/virtual-options-list/Component.js +63 -49
  112. package/esm/components/virtual-options-list/Component.js.map +1 -1
  113. package/esm/mobile/modal.mobile.css +1 -1
  114. package/esm/mobile/modal.mobile.module.css.js +1 -1
  115. package/esm/presets/useSelectWithApply/hook.d.ts +12 -0
  116. package/esm/presets/useSelectWithApply/options-list-with-apply/Component.d.ts +4 -0
  117. package/esm/presets/useSelectWithApply/options-list-with-apply/footer/index.css +2 -7
  118. package/esm/presets/useSelectWithApply/options-list-with-apply/footer/index.module.css.js +1 -1
  119. package/esm/presets/useSelectWithApply/options-list-with-apply/footer/index.module.css.js.map +1 -1
  120. package/esm/presets/useSelectWithApply/options-list-with-apply/header/index.css +12 -9
  121. package/esm/presets/useSelectWithApply/options-list-with-apply/header/index.module.css.js +1 -1
  122. package/esm/presets/useSelectWithApply/options-list-with-apply/header/index.module.css.js.map +1 -1
  123. package/esm/presets/useSelectWithLoading/index.css +1 -1
  124. package/esm/presets/useSelectWithLoading/index.module.css.js +1 -1
  125. package/esm/shared/index.js +1 -1
  126. package/esm/typings.d.ts +21 -1
  127. package/esm/utils.d.ts +1 -6
  128. package/esm/utils.js +21 -29
  129. package/esm/utils.js.map +1 -1
  130. package/mobile/modal.mobile.css +1 -1
  131. package/mobile/modal.mobile.module.css.js +1 -1
  132. package/modern/components/arrow/index.css +4 -4
  133. package/modern/components/arrow/index.module.css.js +1 -1
  134. package/modern/components/base-checkmark/index.css +9 -9
  135. package/modern/components/base-checkmark/index.module.css.js +1 -1
  136. package/modern/components/base-option/index.css +19 -17
  137. package/modern/components/base-option/index.module.css.js +1 -1
  138. package/modern/components/base-select/Component.js +34 -47
  139. package/modern/components/base-select/Component.js.map +1 -1
  140. package/modern/components/base-select/index.css +70 -20
  141. package/modern/components/base-select/index.module.css.js +1 -1
  142. package/modern/components/base-select/index.module.css.js.map +1 -1
  143. package/modern/components/base-select/mobile.css +12 -11
  144. package/modern/components/base-select/mobile.module.css.js +1 -1
  145. package/modern/components/base-select/mobile.module.css.js.map +1 -1
  146. package/modern/components/checkmark/index.css +11 -11
  147. package/modern/components/checkmark/index.module.css.js +1 -1
  148. package/modern/components/checkmark-mobile/index.css +6 -6
  149. package/modern/components/checkmark-mobile/index.module.css.js +1 -1
  150. package/modern/components/clear-button/index.css +4 -4
  151. package/modern/components/clear-button/index.module.css.js +1 -1
  152. package/modern/components/field/index.css +22 -18
  153. package/modern/components/field/index.module.css.js +1 -1
  154. package/modern/components/footer/index.css +4 -4
  155. package/modern/components/footer/index.module.css.js +1 -1
  156. package/modern/components/optgroup/index.css +8 -7
  157. package/modern/components/optgroup/index.module.css.js +1 -1
  158. package/modern/components/option/desktop/index.css +28 -22
  159. package/modern/components/option/desktop/index.module.css.js +1 -1
  160. package/modern/components/option/desktop/index.module.css.js.map +1 -1
  161. package/modern/components/option/mobile/index.css +25 -19
  162. package/modern/components/option/mobile/index.module.css.js +1 -1
  163. package/modern/components/option/mobile/index.module.css.js.map +1 -1
  164. package/modern/components/options-list/Component.d.ts +4 -0
  165. package/modern/components/options-list/Component.js +29 -49
  166. package/modern/components/options-list/Component.js.map +1 -1
  167. package/modern/components/options-list/index.css +13 -33
  168. package/modern/components/options-list/index.module.css.js +1 -1
  169. package/modern/components/options-list/index.module.css.js.map +1 -1
  170. package/modern/components/search/index.css +1 -1
  171. package/modern/components/search/index.module.css.js +1 -1
  172. package/modern/components/virtual-options-list/Component.d.ts +4 -0
  173. package/modern/components/virtual-options-list/Component.js +59 -45
  174. package/modern/components/virtual-options-list/Component.js.map +1 -1
  175. package/modern/mobile/modal.mobile.css +1 -1
  176. package/modern/mobile/modal.mobile.module.css.js +1 -1
  177. package/modern/presets/useSelectWithApply/hook.d.ts +12 -0
  178. package/modern/presets/useSelectWithApply/options-list-with-apply/Component.d.ts +4 -0
  179. package/modern/presets/useSelectWithApply/options-list-with-apply/footer/index.css +2 -7
  180. package/modern/presets/useSelectWithApply/options-list-with-apply/footer/index.module.css.js +1 -1
  181. package/modern/presets/useSelectWithApply/options-list-with-apply/footer/index.module.css.js.map +1 -1
  182. package/modern/presets/useSelectWithApply/options-list-with-apply/header/index.css +12 -9
  183. package/modern/presets/useSelectWithApply/options-list-with-apply/header/index.module.css.js +1 -1
  184. package/modern/presets/useSelectWithApply/options-list-with-apply/header/index.module.css.js.map +1 -1
  185. package/modern/presets/useSelectWithLoading/index.css +1 -1
  186. package/modern/presets/useSelectWithLoading/index.module.css.js +1 -1
  187. package/modern/shared/index.js +1 -1
  188. package/modern/typings.d.ts +21 -1
  189. package/modern/utils.d.ts +1 -6
  190. package/modern/utils.js +21 -29
  191. package/modern/utils.js.map +1 -1
  192. package/moderncssm/components/base-option/index.module.css +2 -1
  193. package/moderncssm/components/base-select/Component.js +34 -47
  194. package/moderncssm/components/base-select/Component.js.map +1 -1
  195. package/moderncssm/components/base-select/index.module.css +67 -9
  196. package/moderncssm/components/base-select/mobile.module.css +1 -0
  197. package/moderncssm/components/field/index.module.css +6 -3
  198. package/moderncssm/components/optgroup/index.module.css +1 -1
  199. package/moderncssm/components/option/desktop/index.module.css +5 -1
  200. package/moderncssm/components/option/mobile/index.module.css +5 -1
  201. package/moderncssm/components/options-list/Component.d.ts +4 -0
  202. package/moderncssm/components/options-list/Component.js +29 -49
  203. package/moderncssm/components/options-list/Component.js.map +1 -1
  204. package/moderncssm/components/options-list/index.module.css +7 -32
  205. package/moderncssm/components/virtual-options-list/Component.d.ts +4 -0
  206. package/moderncssm/components/virtual-options-list/Component.js +59 -45
  207. package/moderncssm/components/virtual-options-list/Component.js.map +1 -1
  208. package/moderncssm/presets/useSelectWithApply/hook.d.ts +12 -0
  209. package/moderncssm/presets/useSelectWithApply/options-list-with-apply/Component.d.ts +4 -0
  210. package/moderncssm/presets/useSelectWithApply/options-list-with-apply/footer/index.module.css +0 -4
  211. package/moderncssm/presets/useSelectWithApply/options-list-with-apply/header/index.module.css +8 -6
  212. package/moderncssm/shared/index.js +1 -1
  213. package/moderncssm/typings.d.ts +21 -1
  214. package/moderncssm/utils.d.ts +1 -6
  215. package/moderncssm/utils.js +21 -29
  216. package/moderncssm/utils.js.map +1 -1
  217. package/package.json +15 -16
  218. package/presets/useSelectWithApply/hook.d.ts +12 -0
  219. package/presets/useSelectWithApply/options-list-with-apply/Component.d.ts +4 -0
  220. package/presets/useSelectWithApply/options-list-with-apply/footer/index.css +2 -7
  221. package/presets/useSelectWithApply/options-list-with-apply/footer/index.module.css.js +1 -1
  222. package/presets/useSelectWithApply/options-list-with-apply/footer/index.module.css.js.map +1 -1
  223. package/presets/useSelectWithApply/options-list-with-apply/header/index.css +12 -9
  224. package/presets/useSelectWithApply/options-list-with-apply/header/index.module.css.js +1 -1
  225. package/presets/useSelectWithApply/options-list-with-apply/header/index.module.css.js.map +1 -1
  226. package/presets/useSelectWithLoading/index.css +1 -1
  227. package/presets/useSelectWithLoading/index.module.css.js +1 -1
  228. package/shared/index.js +0 -1
  229. package/shared/index.js.map +1 -1
  230. package/src/components/base-select/Component.tsx +41 -55
  231. package/src/components/base-select/index.module.css +60 -8
  232. package/src/components/base-select/mobile.module.css +1 -0
  233. package/src/components/option/index.module.css +4 -0
  234. package/src/components/options-list/Component.tsx +54 -97
  235. package/src/components/options-list/index.module.css +7 -31
  236. package/src/components/virtual-options-list/Component.tsx +95 -72
  237. package/src/presets/useSelectWithApply/options-list-with-apply/footer/index.module.css +0 -4
  238. package/src/presets/useSelectWithApply/options-list-with-apply/header/index.module.css +4 -4
  239. package/src/typings.ts +26 -0
  240. package/src/utils.ts +30 -34
  241. package/src/vars.css +3 -0
  242. package/typings.d.ts +21 -1
  243. package/utils.d.ts +1 -6
  244. package/utils.js +19 -28
  245. package/utils.js.map +1 -1
  246. package/components/virtual-options-list/index.css +0 -83
  247. package/components/virtual-options-list/index.module.css.js +0 -8
  248. package/components/virtual-options-list/index.module.css.js.map +0 -1
  249. package/cssm/components/virtual-options-list/index.module.css +0 -83
  250. package/esm/components/virtual-options-list/index.css +0 -83
  251. package/esm/components/virtual-options-list/index.module.css.js +0 -6
  252. package/esm/components/virtual-options-list/index.module.css.js.map +0 -1
  253. package/modern/components/virtual-options-list/index.css +0 -83
  254. package/modern/components/virtual-options-list/index.module.css.js +0 -6
  255. package/modern/components/virtual-options-list/index.module.css.js.map +0 -1
  256. package/moderncssm/components/virtual-options-list/index.module.css +0 -81
  257. package/src/components/virtual-options-list/index.module.css +0 -77
@@ -1,26 +1,43 @@
1
1
  import { __assign } from 'tslib';
2
- import React, { forwardRef, useRef, useState, useEffect, useMemo } from 'react';
3
- import mergeRefs from 'react-merge-refs';
2
+ import React, { forwardRef, useRef, useState, useEffect, useImperativeHandle, useMemo } from 'react';
4
3
  import { useVirtual } from 'react-virtual';
5
4
  import cn from 'classnames';
6
- import { Scrollbar } from '@alfalab/core-components-scrollbar/esm';
5
+ import { ScrollbarPrivate } from '@alfalab/core-components-scrollbar-private/esm';
6
+ import { getElementWindow } from '@alfalab/core-components-shared/esm';
7
7
  import { DEFAULT_VISIBLE_OPTIONS } from '../../consts.js';
8
8
  import { useNativeScrollbar } from '../../hooks/use-native-scrollbar.js';
9
- import { usePrevious, lastIndexOf, useVirtualVisibleOptions, isGroup } from '../../utils.js';
9
+ import { usePrevious, useVirtualVisibleOptions, isGroup } from '../../utils.js';
10
10
  import { Optgroup } from '../optgroup/Component.js';
11
- import styles from './index.module.css.js';
11
+ import styles from '../options-list/index.module.css.js';
12
12
 
13
13
  var VirtualOptionsList = forwardRef(function (_a, ref) {
14
- var _b;
15
- var _c = _a.size, size = _c === void 0 ? 48 : _c, _d = _a.flatOptions, flatOptions = _d === void 0 ? [] : _d, _e = _a.highlightedIndex, highlightedIndex = _e === void 0 ? -1 : _e, optionGroupClassName = _a.optionGroupClassName, className = _a.className, getOptionProps = _a.getOptionProps, _f = _a.groupOptionProps, groupOptionProps = _f === void 0 ? {} : _f, Option = _a.Option, open = _a.open, _g = _a.options, options = _g === void 0 ? [] : _g, _h = _a.Optgroup, Optgroup$1 = _h === void 0 ? Optgroup : _h, dataTestId = _a.dataTestId, emptyPlaceholder = _a.emptyPlaceholder, _j = _a.visibleOptions, visibleOptions = _j === void 0 ? DEFAULT_VISIBLE_OPTIONS : _j, header = _a.header, footer = _a.footer, _k = _a.showFooter, showFooter = _k === void 0 ? true : _k, optionsListWidth = _a.optionsListWidth, onScroll = _a.onScroll, nativeScrollbarProp = _a.nativeScrollbar, setHighlightedIndex = _a.setHighlightedIndex, selectedItems = _a.selectedItems, setSelectedItems = _a.setSelectedItems, search = _a.search, multiple = _a.multiple, scrollbarClassName = _a.scrollbarClassName, client = _a.client;
14
+ var _b, _c;
15
+ var _d;
16
+ var _e = _a.size, size = _e === void 0 ? 48 : _e, _f = _a.flatOptions, flatOptions = _f === void 0 ? [] : _f, _g = _a.highlightedIndex, highlightedIndex = _g === void 0 ? -1 : _g, optionGroupClassName = _a.optionGroupClassName, className = _a.className, getOptionProps = _a.getOptionProps, _h = _a.groupOptionProps, groupOptionProps = _h === void 0 ? {} : _h, Option = _a.Option, open = _a.open, _j = _a.options, options = _j === void 0 ? [] : _j, _k = _a.Optgroup, Optgroup$1 = _k === void 0 ? Optgroup : _k, dataTestId = _a.dataTestId, emptyPlaceholder = _a.emptyPlaceholder, _l = _a.visibleOptions, visibleOptions = _l === void 0 ? DEFAULT_VISIBLE_OPTIONS : _l, header = _a.header, footer = _a.footer, _m = _a.showFooter, showFooter = _m === void 0 ? true : _m, onScroll = _a.onScroll, nativeScrollbarProp = _a.nativeScrollbar, setHighlightedIndex = _a.setHighlightedIndex, selectedItems = _a.selectedItems, setSelectedItems = _a.setSelectedItems, search = _a.search, multiple = _a.multiple, scrollbarClassName = _a.scrollbarClassName, client = _a.client, scrollableNodeClassName = _a.scrollableNodeClassName, contentNodeClassName = _a.contentNodeClassName, listNodeClassName = _a.listNodeClassName, footerClassName = _a.footerClassName, ctrlRef = _a.ctrlRef;
16
17
  var listRef = useRef(null);
17
- var parentRef = useRef(null);
18
- var scrollbarRef = useRef(null);
19
- var _l = useState(''), visibleOptionsInvalidateKey = _l[0], setVisibleOptionsInvalidateKey = _l[1];
18
+ var scrollableNodeRef = useRef(null);
19
+ var noOptions = options.length === 0;
20
+ var _o = useState(true), scrollTop = _o[0], setScrollTop = _o[1];
21
+ var _p = useState(false), scrollBottom = _p[0], setScrollBottom = _p[1];
22
+ var _q = useState(''), visibleOptionsInvalidateKey = _q[0], setVisibleOptionsInvalidateKey = _q[1];
20
23
  var prevHighlightedIndex = usePrevious(highlightedIndex) || -1;
21
24
  var rowVirtualizer = useVirtual({
25
+ scrollToFn: function (offset, defaultScrollToFn) {
26
+ var delta = 0;
27
+ var list = listRef.current;
28
+ if (list) {
29
+ var win_1 = getElementWindow(list);
30
+ delta = ['::before', '::after']
31
+ .map(function (pseudo) {
32
+ var paddingTop = win_1.getComputedStyle(list, pseudo).paddingTop;
33
+ return parseFloat(paddingTop) || 0;
34
+ })
35
+ .reduce(function (a, b) { return a + b; });
36
+ }
37
+ defaultScrollToFn === null || defaultScrollToFn === void 0 ? void 0 : defaultScrollToFn(offset === 0 ? offset : offset + delta);
38
+ },
22
39
  size: flatOptions.length,
23
- parentRef: (ref || parentRef),
40
+ parentRef: ref || scrollableNodeRef,
24
41
  overscan: 15,
25
42
  });
26
43
  var nativeScrollbar = useNativeScrollbar({
@@ -34,20 +51,12 @@ var VirtualOptionsList = forwardRef(function (_a, ref) {
34
51
  }
35
52
  // eslint-disable-next-line react-hooks/exhaustive-deps
36
53
  }, [open]);
37
- // Скролл к пункту, которого нет на экране
38
- useEffect(function () {
39
- if (highlightedIndex === -1)
40
- return;
41
- if (!rowVirtualizer.virtualItems.some(function (option) { return option.index === highlightedIndex; })) {
42
- rowVirtualizer.scrollToIndex(highlightedIndex, { align: 'end' });
43
- }
44
- // eslint-disable-next-line react-hooks/exhaustive-deps
45
- }, [highlightedIndex]);
54
+ useImperativeHandle(ctrlRef, function () { return rowVirtualizer; }, [rowVirtualizer]);
46
55
  // Циклическая навигация
47
56
  useEffect(function () {
48
57
  var notDisabled = function (option) { return !option.disabled; };
49
58
  var firstNonDisabled = flatOptions.findIndex(notDisabled);
50
- var lastNonDisabled = lastIndexOf(flatOptions, notDisabled);
59
+ var lastNonDisabled = flatOptions.findLastIndex(notDisabled);
51
60
  if (prevHighlightedIndex <= firstNonDisabled &&
52
61
  highlightedIndex === flatOptions.length - 1) {
53
62
  rowVirtualizer.scrollToIndex(lastNonDisabled);
@@ -70,11 +79,10 @@ var VirtualOptionsList = forwardRef(function (_a, ref) {
70
79
  .join('_'));
71
80
  // eslint-disable-next-line react-hooks/exhaustive-deps
72
81
  }, [rowVirtualizer.virtualItems.length, flatOptions]);
73
- useVirtualVisibleOptions({
82
+ var maxHeight = useVirtualVisibleOptions({
74
83
  visibleOptions: visibleOptions,
75
84
  invalidate: visibleOptionsInvalidateKey,
76
85
  listRef: listRef,
77
- styleTargetRef: nativeScrollbar ? parentRef : scrollbarRef,
78
86
  open: open,
79
87
  });
80
88
  // Т.к. рендерится плоский список, необходимо знать индекс, когда начинается новая группа
@@ -91,9 +99,16 @@ var VirtualOptionsList = forwardRef(function (_a, ref) {
91
99
  return acc;
92
100
  }, {});
93
101
  }, [options]);
102
+ var handleScroll = function (event) {
103
+ var scrolledToHeader = event.currentTarget.scrollTop <= 0;
104
+ var scrolledToFooter = event.currentTarget.scrollHeight - event.currentTarget.offsetHeight <=
105
+ event.currentTarget.scrollTop;
106
+ setScrollTop(scrolledToHeader);
107
+ setScrollBottom(scrolledToFooter);
108
+ onScroll === null || onScroll === void 0 ? void 0 : onScroll(event);
109
+ };
94
110
  var renderList = function () {
95
111
  return rowVirtualizer.virtualItems.map(function (virtualRow) {
96
- var _a;
97
112
  var option = flatOptions[virtualRow.index];
98
113
  var renderGroup = function () {
99
114
  var group = options[groupStartIndexes[virtualRow.index]];
@@ -112,39 +127,38 @@ var VirtualOptionsList = forwardRef(function (_a, ref) {
112
127
  };
113
128
  return (React.createElement(Optgroup$1, __assign({ label: group.label, size: size, className: optionGroupClassName, options: group.options, selectedItems: groupSelectedItems, setSelectedItems: handleSelectedItems, search: search, multiple: multiple }, groupOptionProps)));
114
129
  };
115
- return (React.createElement("div", { key: virtualRow.index, ref: virtualRow.measureRef, className: cn(styles.virtualRow, (_a = {},
116
- _a[styles.highlighted] = highlightedIndex === virtualRow.index,
117
- _a)), style: {
118
- transform: "translateY(".concat(virtualRow.start, "px)"),
119
- } },
130
+ return (React.createElement("div", { key: virtualRow.index, ref: virtualRow.measureRef },
120
131
  renderGroup(),
121
132
  !isGroup(option) && (React.createElement(Option, __assign({}, getOptionProps(option, virtualRow.index))))));
122
133
  });
123
134
  };
124
- var contentNodeProps = {
125
- className: styles.inner,
126
- style: { height: "".concat(rowVirtualizer.totalSize, "px") },
127
- ref: listRef,
128
- };
129
- var renderWithCustomScrollbar = function () { return (React.createElement(Scrollbar, { className: cn(styles.scrollable, scrollbarClassName), ref: scrollbarRef, horizontalAutoStretch: optionsListWidth === 'content', scrollableNodeProps: { onScroll: onScroll, ref: parentRef }, contentNodeProps: contentNodeProps }, renderList())); };
130
- var renderWithNativeScrollbar = function () {
131
- if (visibleOptions) {
132
- return (React.createElement("div", { className: cn(styles.scrollable, scrollbarClassName), ref: mergeRefs([parentRef, ref]), onScroll: onScroll },
133
- React.createElement("div", __assign({}, contentNodeProps), renderList())));
134
- }
135
- return React.createElement("div", __assign({}, contentNodeProps), renderList());
136
- };
137
135
  var resetHighlightedIndex = function () { return setHighlightedIndex === null || setHighlightedIndex === void 0 ? void 0 : setHighlightedIndex(-1); };
138
136
  if (options.length === 0 && !emptyPlaceholder) {
139
137
  return null;
140
138
  }
141
- return (React.createElement("div", { className: cn(styles.virtualOptionsList, styles["size-".concat(size)], className), "data-test-id": dataTestId },
142
- header && (React.createElement("div", { className: styles.virtualOptionsListHeader, onMouseEnter: resetHighlightedIndex }, header)),
143
- nativeScrollbar ? renderWithNativeScrollbar() : renderWithCustomScrollbar(),
144
- emptyPlaceholder && options.length === 0 && (React.createElement("div", { className: styles.emptyPlaceholder }, emptyPlaceholder)),
145
- showFooter && footer && (React.createElement("div", { onMouseEnter: resetHighlightedIndex, className: cn(styles.virtualOptionsListFooter, (_b = {},
146
- _b[styles.withBorder] = visibleOptions && flatOptions.length > visibleOptions,
147
- _b)) }, footer))));
139
+ var firstVirualRow = rowVirtualizer.virtualItems[0];
140
+ return (React.createElement("div", __assign({}, (nativeScrollbar && { 'data-test-id': dataTestId }), { className: cn(styles.optionsList, styles["size-".concat(size)], className) }),
141
+ header && (React.createElement("div", { className: cn(styles.optionsListHeader, (_b = {},
142
+ _b[styles.headerHighlighted] = !scrollTop,
143
+ _b)), onMouseEnter: resetHighlightedIndex }, header)),
144
+ !noOptions && (React.createElement(ScrollbarPrivate, { native: nativeScrollbar, className: scrollbarClassName, style: { maxHeight: maxHeight }, scrollableNodeProps: {
145
+ ref: scrollableNodeRef,
146
+ onScroll: handleScroll,
147
+ className: scrollableNodeClassName,
148
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
149
+ // @ts-expect-error
150
+ 'data-test-id': nativeScrollbar ? undefined : dataTestId,
151
+ }, contentNodeProps: {
152
+ className: contentNodeClassName,
153
+ style: { minHeight: rowVirtualizer.totalSize },
154
+ } },
155
+ React.createElement("div", { className: cn(styles.list, listNodeClassName), ref: listRef, style: { transform: "translateY(".concat((_d = firstVirualRow === null || firstVirualRow === void 0 ? void 0 : firstVirualRow.start) !== null && _d !== void 0 ? _d : 0, "px)") } }, renderList()))),
156
+ emptyPlaceholder && noOptions && (React.createElement("div", { className: styles.emptyPlaceholder }, emptyPlaceholder)),
157
+ showFooter && footer && (React.createElement("div", { onMouseEnter: resetHighlightedIndex, className: cn(styles.optionsListFooter, footerClassName, (_c = {},
158
+ _c[styles.withBorder] = visibleOptions &&
159
+ flatOptions.length > visibleOptions &&
160
+ !scrollBottom,
161
+ _c)) }, footer))));
148
162
  });
149
163
 
150
164
  export { VirtualOptionsList };
@@ -1 +1 @@
1
- {"version":3,"file":"Component.js","sources":["../../../src/components/virtual-options-list/Component.tsx"],"sourcesContent":["import React, { forwardRef, useEffect, useMemo, useRef, useState } from 'react';\nimport mergeRefs from 'react-merge-refs';\nimport { useVirtual } from 'react-virtual';\nimport cn from 'classnames';\n\nimport { Scrollbar } from '@alfalab/core-components-scrollbar';\n\nimport { DEFAULT_VISIBLE_OPTIONS } from '../../consts';\nimport { useNativeScrollbar } from '../../hooks/use-native-scrollbar';\nimport { type GroupShape, type OptionShape, type OptionsListProps } from '../../typings';\nimport { isGroup, lastIndexOf, usePrevious, useVirtualVisibleOptions } from '../../utils';\nimport { Optgroup as DefaultOptgroup } from '../optgroup';\n\nimport styles from './index.module.css';\n\nexport const VirtualOptionsList = forwardRef<HTMLDivElement, OptionsListProps>(\n (\n {\n size = 48,\n flatOptions = [],\n highlightedIndex = -1,\n optionGroupClassName,\n className,\n getOptionProps,\n groupOptionProps = {},\n Option,\n open,\n options = [],\n Optgroup = DefaultOptgroup,\n dataTestId,\n emptyPlaceholder,\n visibleOptions = DEFAULT_VISIBLE_OPTIONS,\n header,\n footer,\n showFooter = true,\n optionsListWidth,\n onScroll,\n nativeScrollbar: nativeScrollbarProp,\n setHighlightedIndex,\n selectedItems,\n setSelectedItems,\n search,\n multiple,\n scrollbarClassName,\n client,\n },\n ref,\n ) => {\n const listRef = useRef<HTMLDivElement>(null);\n const parentRef = useRef<HTMLDivElement>(null);\n const scrollbarRef = useRef<HTMLDivElement>(null);\n const [visibleOptionsInvalidateKey, setVisibleOptionsInvalidateKey] = useState('');\n const prevHighlightedIndex = usePrevious(highlightedIndex) || -1;\n\n const rowVirtualizer = useVirtual({\n size: flatOptions.length,\n parentRef: (ref || parentRef) as React.RefObject<HTMLDivElement>,\n overscan: 15,\n });\n\n const nativeScrollbar = useNativeScrollbar({\n nativeScrollbar: nativeScrollbarProp,\n client,\n });\n\n // Сколл к выбранному пункту при открытии меню\n useEffect(() => {\n if (open) {\n rowVirtualizer.scrollToIndex(highlightedIndex, { align: 'end' });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open]);\n\n // Скролл к пункту, которого нет на экране\n useEffect(() => {\n if (highlightedIndex === -1) return;\n\n if (!rowVirtualizer.virtualItems.some((option) => option.index === highlightedIndex)) {\n rowVirtualizer.scrollToIndex(highlightedIndex, { align: 'end' });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [highlightedIndex]);\n\n // Циклическая навигация\n useEffect(() => {\n const notDisabled = (option: OptionShape) => !option.disabled;\n const firstNonDisabled = flatOptions.findIndex(notDisabled);\n const lastNonDisabled = lastIndexOf(flatOptions, notDisabled);\n\n if (\n prevHighlightedIndex <= firstNonDisabled &&\n highlightedIndex === flatOptions.length - 1\n ) {\n rowVirtualizer.scrollToIndex(lastNonDisabled);\n }\n\n if (prevHighlightedIndex >= lastNonDisabled && highlightedIndex === 0) {\n rowVirtualizer.scrollToIndex(0);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [prevHighlightedIndex, highlightedIndex]);\n\n useEffect(() => {\n setVisibleOptionsInvalidateKey(\n /**\n * react-virtual может несколько раз отрендерить список с одним элементом,\n * поэтому нужно еще раз пересчитать высоту, когда список ВИДИМЫХ пунктов будет отрендерен полностью\n * Также, высоту нужно пересчитывать при изменении пунктов меню\n */\n rowVirtualizer.virtualItems\n .slice(0, Math.min(rowVirtualizer.virtualItems.length, visibleOptions + 1))\n .map((item) => flatOptions[item.index].key)\n .join('_'),\n );\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [rowVirtualizer.virtualItems.length, flatOptions]);\n\n useVirtualVisibleOptions({\n visibleOptions,\n invalidate: visibleOptionsInvalidateKey,\n listRef,\n styleTargetRef: nativeScrollbar ? parentRef : scrollbarRef,\n open,\n });\n\n // Т.к. рендерится плоский список, необходимо знать индекс, когда начинается новая группа\n const groupStartIndexes = useMemo(() => {\n let currentIndex = 0;\n\n return options.reduce((acc: { [key: number]: number }, option, index) => {\n if (isGroup(option)) {\n acc[currentIndex] = index;\n currentIndex += option.options.length;\n } else {\n currentIndex += 1;\n }\n\n return acc;\n }, {});\n }, [options]);\n\n const renderList = () =>\n rowVirtualizer.virtualItems.map((virtualRow) => {\n const option = flatOptions[virtualRow.index];\n const renderGroup = () => {\n const group = options[groupStartIndexes[virtualRow.index]] as GroupShape;\n\n if (!group) return null;\n\n const groupSelectedItems = selectedItems?.filter(({ key: selectedItemKey }) =>\n group.options.some((opt) => opt.key === selectedItemKey),\n );\n const handleSelectedItems = (items: OptionShape[]) => {\n setSelectedItems(\n (\n selectedItems?.filter(\n ({ key: selectedItemKey }) =>\n !group.options.some((opt) => opt.key === selectedItemKey),\n ) ?? []\n ).concat(items),\n );\n };\n\n return (\n <Optgroup\n label={group.label}\n size={size}\n className={optionGroupClassName}\n options={group.options}\n selectedItems={groupSelectedItems}\n setSelectedItems={handleSelectedItems}\n search={search}\n multiple={multiple}\n {...groupOptionProps}\n />\n );\n };\n\n return (\n <div\n key={virtualRow.index}\n ref={virtualRow.measureRef}\n className={cn(styles.virtualRow, {\n [styles.highlighted]: highlightedIndex === virtualRow.index,\n })}\n style={{\n transform: `translateY(${virtualRow.start}px)`,\n }}\n >\n {renderGroup()}\n {!isGroup(option) && (\n <Option {...getOptionProps(option, virtualRow.index)} />\n )}\n </div>\n );\n });\n\n const contentNodeProps = {\n className: styles.inner,\n style: { height: `${rowVirtualizer.totalSize}px` },\n ref: listRef,\n };\n\n const renderWithCustomScrollbar = () => (\n <Scrollbar\n className={cn(styles.scrollable, scrollbarClassName)}\n ref={scrollbarRef}\n horizontalAutoStretch={optionsListWidth === 'content'}\n scrollableNodeProps={{ onScroll, ref: parentRef }}\n contentNodeProps={contentNodeProps}\n >\n {renderList()}\n </Scrollbar>\n );\n\n const renderWithNativeScrollbar = () => {\n if (visibleOptions) {\n return (\n <div\n className={cn(styles.scrollable, scrollbarClassName)}\n ref={mergeRefs([parentRef, ref])}\n onScroll={onScroll}\n >\n <div {...contentNodeProps}>{renderList()}</div>\n </div>\n );\n }\n\n return <div {...contentNodeProps}>{renderList()}</div>;\n };\n\n const resetHighlightedIndex = () => setHighlightedIndex?.(-1);\n\n if (options.length === 0 && !emptyPlaceholder) {\n return null;\n }\n\n return (\n <div\n className={cn(styles.virtualOptionsList, styles[`size-${size}`], className)}\n data-test-id={dataTestId}\n >\n {header && (\n <div\n className={styles.virtualOptionsListHeader}\n onMouseEnter={resetHighlightedIndex}\n >\n {header}\n </div>\n )}\n\n {nativeScrollbar ? renderWithNativeScrollbar() : renderWithCustomScrollbar()}\n\n {emptyPlaceholder && options.length === 0 && (\n <div className={styles.emptyPlaceholder}>{emptyPlaceholder}</div>\n )}\n\n {showFooter && footer && (\n <div\n onMouseEnter={resetHighlightedIndex}\n className={cn(styles.virtualOptionsListFooter, {\n [styles.withBorder]:\n visibleOptions && flatOptions.length > visibleOptions,\n })}\n >\n {footer}\n </div>\n )}\n </div>\n );\n },\n);\n"],"names":["Optgroup","DefaultOptgroup"],"mappings":";;;;;;;;;;;;IAea,kBAAkB,GAAG,UAAU,CACxC,UACI,EA4BC,EACD,GAAG,EAAA;;QA5BC,EAAS,GAAA,EAAA,CAAA,IAAA,EAAT,IAAI,GAAA,EAAA,KAAA,MAAA,GAAG,EAAE,GAAA,EAAA,EACT,EAAgB,GAAA,EAAA,CAAA,WAAA,EAAhB,WAAW,GAAA,EAAA,KAAA,MAAA,GAAG,EAAE,GAAA,EAAA,EAChB,EAAqB,GAAA,EAAA,CAAA,gBAAA,EAArB,gBAAgB,GAAA,EAAA,KAAA,MAAA,GAAG,EAAE,KAAA,EACrB,oBAAoB,GAAA,EAAA,CAAA,oBAAA,EACpB,SAAS,GAAA,EAAA,CAAA,SAAA,EACT,cAAc,GAAA,EAAA,CAAA,cAAA,EACd,EAAA,GAAA,EAAA,CAAA,gBAAqB,EAArB,gBAAgB,mBAAG,EAAE,GAAA,EAAA,EACrB,MAAM,GAAA,EAAA,CAAA,MAAA,EACN,IAAI,GAAA,EAAA,CAAA,IAAA,EACJ,EAAY,GAAA,EAAA,CAAA,OAAA,EAAZ,OAAO,GAAA,EAAA,KAAA,MAAA,GAAG,EAAE,GAAA,EAAA,EACZ,EAAA,GAAA,EAAA,CAAA,QAA0B,EAA1BA,UAAQ,GAAG,EAAA,KAAA,MAAA,GAAAC,QAAe,KAAA,EAC1B,UAAU,GAAA,EAAA,CAAA,UAAA,EACV,gBAAgB,GAAA,EAAA,CAAA,gBAAA,EAChB,EAAwC,GAAA,EAAA,CAAA,cAAA,EAAxC,cAAc,GAAA,EAAA,KAAA,MAAA,GAAG,uBAAuB,GAAA,EAAA,EACxC,MAAM,GAAA,EAAA,CAAA,MAAA,EACN,MAAM,GAAA,EAAA,CAAA,MAAA,EACN,EAAiB,GAAA,EAAA,CAAA,UAAA,EAAjB,UAAU,GAAA,EAAA,KAAA,MAAA,GAAG,IAAI,GAAA,EAAA,EACjB,gBAAgB,sBAAA,EAChB,QAAQ,GAAA,EAAA,CAAA,QAAA,EACS,mBAAmB,GAAA,EAAA,CAAA,eAAA,EACpC,mBAAmB,GAAA,EAAA,CAAA,mBAAA,EACnB,aAAa,GAAA,EAAA,CAAA,aAAA,EACb,gBAAgB,GAAA,EAAA,CAAA,gBAAA,EAChB,MAAM,GAAA,EAAA,CAAA,MAAA,EACN,QAAQ,GAAA,EAAA,CAAA,QAAA,EACR,kBAAkB,GAAA,EAAA,CAAA,kBAAA,EAClB,MAAM,GAAA,EAAA,CAAA,MAAA;AAIV,IAAA,IAAM,OAAO,GAAG,MAAM,CAAiB,IAAI,CAAC;AAC5C,IAAA,IAAM,SAAS,GAAG,MAAM,CAAiB,IAAI,CAAC;AAC9C,IAAA,IAAM,YAAY,GAAG,MAAM,CAAiB,IAAI,CAAC;IAC3C,IAAA,EAAA,GAAgE,QAAQ,CAAC,EAAE,CAAC,EAA3E,2BAA2B,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,8BAA8B,GAAA,EAAA,CAAA,CAAA,CAAgB;IAClF,IAAM,oBAAoB,GAAG,WAAW,CAAC,gBAAgB,CAAC,IAAI,EAAE;IAEhE,IAAM,cAAc,GAAG,UAAU,CAAC;QAC9B,IAAI,EAAE,WAAW,CAAC,MAAM;AACxB,QAAA,SAAS,GAAG,GAAG,IAAI,SAAS,CAAoC;AAChE,QAAA,QAAQ,EAAE,EAAE;AACf,KAAA,CAAC;IAEF,IAAM,eAAe,GAAG,kBAAkB,CAAC;AACvC,QAAA,eAAe,EAAE,mBAAmB;AACpC,QAAA,MAAM,EAAA,MAAA;AACT,KAAA,CAAC;;AAGF,IAAA,SAAS,CAAC,YAAA;QACN,IAAI,IAAI,EAAE;YACN,cAAc,CAAC,aAAa,CAAC,gBAAgB,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;;;AAGxE,KAAC,EAAE,CAAC,IAAI,CAAC,CAAC;;AAGV,IAAA,SAAS,CAAC,YAAA;QACN,IAAI,gBAAgB,KAAK,EAAE;YAAE;QAE7B,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,IAAI,CAAC,UAAC,MAAM,EAAA,EAAK,OAAA,MAAM,CAAC,KAAK,KAAK,gBAAgB,GAAA,CAAC,EAAE;YAClF,cAAc,CAAC,aAAa,CAAC,gBAAgB,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;;;AAGxE,KAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC;;AAGtB,IAAA,SAAS,CAAC,YAAA;AACN,QAAA,IAAM,WAAW,GAAG,UAAC,MAAmB,EAAK,EAAA,OAAA,CAAC,MAAM,CAAC,QAAQ,CAAhB,EAAgB;QAC7D,IAAM,gBAAgB,GAAG,WAAW,CAAC,SAAS,CAAC,WAAW,CAAC;QAC3D,IAAM,eAAe,GAAG,WAAW,CAAC,WAAW,EAAE,WAAW,CAAC;QAE7D,IACI,oBAAoB,IAAI,gBAAgB;AACxC,YAAA,gBAAgB,KAAK,WAAW,CAAC,MAAM,GAAG,CAAC,EAC7C;AACE,YAAA,cAAc,CAAC,aAAa,CAAC,eAAe,CAAC;;QAGjD,IAAI,oBAAoB,IAAI,eAAe,IAAI,gBAAgB,KAAK,CAAC,EAAE;AACnE,YAAA,cAAc,CAAC,aAAa,CAAC,CAAC,CAAC;;;AAGvC,KAAC,EAAE,CAAC,oBAAoB,EAAE,gBAAgB,CAAC,CAAC;AAE5C,IAAA,SAAS,CAAC,YAAA;QACN,8BAA8B;AAC1B;;;;AAIG;AACH,QAAA,cAAc,CAAC;AACV,aAAA,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,YAAY,CAAC,MAAM,EAAE,cAAc,GAAG,CAAC,CAAC;AACzE,aAAA,GAAG,CAAC,UAAC,IAAI,EAAA,EAAK,OAAA,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAA,EAAA;AACzC,aAAA,IAAI,CAAC,GAAG,CAAC,CACjB;;KAEJ,EAAE,CAAC,cAAc,CAAC,YAAY,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AAErD,IAAA,wBAAwB,CAAC;AACrB,QAAA,cAAc,EAAA,cAAA;AACd,QAAA,UAAU,EAAE,2BAA2B;AACvC,QAAA,OAAO,EAAA,OAAA;QACP,cAAc,EAAE,eAAe,GAAG,SAAS,GAAG,YAAY;AAC1D,QAAA,IAAI,EAAA,IAAA;AACP,KAAA,CAAC;;IAGF,IAAM,iBAAiB,GAAG,OAAO,CAAC,YAAA;QAC9B,IAAI,YAAY,GAAG,CAAC;QAEpB,OAAO,OAAO,CAAC,MAAM,CAAC,UAAC,GAA8B,EAAE,MAAM,EAAE,KAAK,EAAA;AAChE,YAAA,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE;AACjB,gBAAA,GAAG,CAAC,YAAY,CAAC,GAAG,KAAK;AACzB,gBAAA,YAAY,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM;;iBAClC;gBACH,YAAY,IAAI,CAAC;;AAGrB,YAAA,OAAO,GAAG;SACb,EAAE,EAAE,CAAC;AACV,KAAC,EAAE,CAAC,OAAO,CAAC,CAAC;AAEb,IAAA,IAAM,UAAU,GAAG,YAAA;AACf,QAAA,OAAA,cAAc,CAAC,YAAY,CAAC,GAAG,CAAC,UAAC,UAAU,EAAA;;YACvC,IAAM,MAAM,GAAG,WAAW,CAAC,UAAU,CAAC,KAAK,CAAC;AAC5C,YAAA,IAAM,WAAW,GAAG,YAAA;gBAChB,IAAM,KAAK,GAAG,OAAO,CAAC,iBAAiB,CAAC,UAAU,CAAC,KAAK,CAAC,CAAe;AAExE,gBAAA,IAAI,CAAC,KAAK;AAAE,oBAAA,OAAO,IAAI;gBAEvB,IAAM,kBAAkB,GAAG,aAAa,KAAb,IAAA,IAAA,aAAa,KAAb,MAAA,GAAA,MAAA,GAAA,aAAa,CAAE,MAAM,CAAC,UAAC,EAAwB,EAAA;AAAjB,oBAAA,IAAA,eAAe,GAAA,EAAA,CAAA,GAAA;AACpE,oBAAA,OAAA,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,UAAC,GAAG,EAAK,EAAA,OAAA,GAAG,CAAC,GAAG,KAAK,eAAe,CAAA,EAAA,CAAC;AAAxD,iBAAwD,CAC3D;gBACD,IAAM,mBAAmB,GAAG,UAAC,KAAoB,EAAA;;AAC7C,oBAAA,gBAAgB,CACZ,CACI,CAAA,EAAA,GAAA,aAAa,KAAb,IAAA,IAAA,aAAa,KAAb,MAAA,GAAA,MAAA,GAAA,aAAa,CAAE,MAAM,CACjB,UAAC,EAAwB,EAAA;AAAjB,wBAAA,IAAA,eAAe,GAAA,EAAA,CAAA,GAAA;AACnB,wBAAA,OAAA,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,UAAC,GAAG,EAAK,EAAA,OAAA,GAAG,CAAC,GAAG,KAAK,eAAe,CAAA,EAAA,CAAC;qBAAA,CAChE,MAAI,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAAA,EAAE,EACT,MAAM,CAAC,KAAK,CAAC,CAClB;AACL,iBAAC;AAED,gBAAA,QACI,KAAC,CAAA,aAAA,CAAAD,UAAQ,aACL,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,oBAAoB,EAC/B,OAAO,EAAE,KAAK,CAAC,OAAO,EACtB,aAAa,EAAE,kBAAkB,EACjC,gBAAgB,EAAE,mBAAmB,EACrC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,QAAQ,IACd,gBAAgB,CAAA,CACtB;AAEV,aAAC;YAED,QACI,6BACI,GAAG,EAAE,UAAU,CAAC,KAAK,EACrB,GAAG,EAAE,UAAU,CAAC,UAAU,EAC1B,SAAS,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,GAAA,EAAA,GAAA,EAAA;oBAC3B,EAAC,CAAA,MAAM,CAAC,WAAW,CAAA,GAAG,gBAAgB,KAAK,UAAU,CAAC,KAAK;AAC7D,oBAAA,EAAA,EAAA,EACF,KAAK,EAAE;AACH,oBAAA,SAAS,EAAE,aAAA,CAAA,MAAA,CAAc,UAAU,CAAC,KAAK,EAAK,KAAA,CAAA;AACjD,iBAAA,EAAA;AAEA,gBAAA,WAAW,EAAE;gBACb,CAAC,OAAO,CAAC,MAAM,CAAC,KACb,KAAA,CAAA,aAAA,CAAC,MAAM,EAAK,QAAA,CAAA,EAAA,EAAA,cAAc,CAAC,MAAM,EAAE,UAAU,CAAC,KAAK,CAAC,CAAI,CAAA,CAC3D,CACC;AAEd,SAAC,CAAC;AArDF,KAqDE;AAEN,IAAA,IAAM,gBAAgB,GAAG;QACrB,SAAS,EAAE,MAAM,CAAC,KAAK;QACvB,KAAK,EAAE,EAAE,MAAM,EAAE,UAAG,cAAc,CAAC,SAAS,EAAA,IAAA,CAAI,EAAE;AAClD,QAAA,GAAG,EAAE,OAAO;KACf;IAED,IAAM,yBAAyB,GAAG,YAAM,EAAA,QACpC,KAAC,CAAA,aAAA,CAAA,SAAS,EACN,EAAA,SAAS,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,EAAE,kBAAkB,CAAC,EACpD,GAAG,EAAE,YAAY,EACjB,qBAAqB,EAAE,gBAAgB,KAAK,SAAS,EACrD,mBAAmB,EAAE,EAAE,QAAQ,EAAA,QAAA,EAAE,GAAG,EAAE,SAAS,EAAE,EACjD,gBAAgB,EAAE,gBAAgB,EAEjC,EAAA,UAAU,EAAE,CACL,EATwB,EAUvC;AAED,IAAA,IAAM,yBAAyB,GAAG,YAAA;QAC9B,IAAI,cAAc,EAAE;YAChB,QACI,KACI,CAAA,aAAA,CAAA,KAAA,EAAA,EAAA,SAAS,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,EAAE,kBAAkB,CAAC,EACpD,GAAG,EAAE,SAAS,CAAC,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,EAChC,QAAQ,EAAE,QAAQ,EAAA;AAElB,gBAAA,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,QAAA,CAAA,EAAA,EAAS,gBAAgB,CAAG,EAAA,UAAU,EAAE,CAAO,CAC7C;;AAId,QAAA,OAAO,wCAAS,gBAAgB,CAAA,EAAG,UAAU,EAAE,CAAO;AAC1D,KAAC;AAED,IAAA,IAAM,qBAAqB,GAAG,YAAM,EAAA,OAAA,mBAAmB,KAAnB,IAAA,IAAA,mBAAmB,KAAnB,MAAA,GAAA,MAAA,GAAA,mBAAmB,CAAG,EAAE,CAAC,CAAA,EAAA;IAE7D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,gBAAgB,EAAE;AAC3C,QAAA,OAAO,IAAI;;IAGf,QACI,6BACI,SAAS,EAAE,EAAE,CAAC,MAAM,CAAC,kBAAkB,EAAE,MAAM,CAAC,OAAA,CAAA,MAAA,CAAQ,IAAI,CAAE,CAAC,EAAE,SAAS,CAAC,kBAC7D,UAAU,EAAA;AAEvB,QAAA,MAAM,KACH,KACI,CAAA,aAAA,CAAA,KAAA,EAAA,EAAA,SAAS,EAAE,MAAM,CAAC,wBAAwB,EAC1C,YAAY,EAAE,qBAAqB,EAElC,EAAA,MAAM,CACL,CACT;QAEA,eAAe,GAAG,yBAAyB,EAAE,GAAG,yBAAyB,EAAE;AAE3E,QAAA,gBAAgB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,KACrC,KAAK,CAAA,aAAA,CAAA,KAAA,EAAA,EAAA,SAAS,EAAE,MAAM,CAAC,gBAAgB,EAAG,EAAA,gBAAgB,CAAO,CACpE;AAEA,QAAA,UAAU,IAAI,MAAM,KACjB,6BACI,YAAY,EAAE,qBAAqB,EACnC,SAAS,EAAE,EAAE,CAAC,MAAM,CAAC,wBAAwB,GAAA,EAAA,GAAA,EAAA;gBACzC,EAAC,CAAA,MAAM,CAAC,UAAU,CACd,GAAA,cAAc,IAAI,WAAW,CAAC,MAAM,GAAG,cAAc;AAC3D,gBAAA,EAAA,EAAA,EAAA,EAED,MAAM,CACL,CACT,CACC;AAEd,CAAC;;;;"}
1
+ {"version":3,"file":"Component.js","sources":["../../../src/components/virtual-options-list/Component.tsx"],"sourcesContent":["import React, {\n forwardRef,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { useVirtual } from 'react-virtual';\nimport cn from 'classnames';\n\nimport { ScrollbarPrivate } from '@alfalab/core-components-scrollbar-private';\nimport { getElementWindow } from '@alfalab/core-components-shared';\n\nimport { DEFAULT_VISIBLE_OPTIONS } from '../../consts';\nimport { useNativeScrollbar } from '../../hooks/use-native-scrollbar';\nimport { type GroupShape, type OptionShape, type OptionsListProps } from '../../typings';\nimport { isGroup, usePrevious, useVirtualVisibleOptions } from '../../utils';\nimport { Optgroup as DefaultOptgroup } from '../optgroup';\n\nimport styles from '../options-list/index.module.css';\n\nexport const VirtualOptionsList = forwardRef<HTMLDivElement, OptionsListProps>(\n (\n {\n size = 48,\n flatOptions = [],\n highlightedIndex = -1,\n optionGroupClassName,\n className,\n getOptionProps,\n groupOptionProps = {},\n Option,\n open,\n options = [],\n Optgroup = DefaultOptgroup,\n dataTestId,\n emptyPlaceholder,\n visibleOptions = DEFAULT_VISIBLE_OPTIONS,\n header,\n footer,\n showFooter = true,\n onScroll,\n nativeScrollbar: nativeScrollbarProp,\n setHighlightedIndex,\n selectedItems,\n setSelectedItems,\n search,\n multiple,\n scrollbarClassName,\n client,\n scrollableNodeClassName,\n contentNodeClassName,\n listNodeClassName,\n footerClassName,\n ctrlRef,\n },\n ref,\n ) => {\n const listRef = useRef<HTMLDivElement>(null);\n const scrollableNodeRef = useRef<HTMLDivElement>(null);\n const noOptions = options.length === 0;\n const [scrollTop, setScrollTop] = useState(true);\n const [scrollBottom, setScrollBottom] = useState(false);\n const [visibleOptionsInvalidateKey, setVisibleOptionsInvalidateKey] = useState('');\n const prevHighlightedIndex = usePrevious(highlightedIndex) || -1;\n\n const rowVirtualizer = useVirtual({\n scrollToFn(offset, defaultScrollToFn) {\n let delta = 0;\n const list = listRef.current;\n\n if (list) {\n const win = getElementWindow(list);\n\n delta = ['::before', '::after']\n .map((pseudo) => {\n const { paddingTop } = win.getComputedStyle(list, pseudo);\n\n return parseFloat(paddingTop) || 0;\n })\n .reduce((a, b) => a + b);\n }\n\n defaultScrollToFn?.(offset === 0 ? offset : offset + delta);\n },\n size: flatOptions.length,\n parentRef: (ref as React.RefObject<HTMLDivElement>) || scrollableNodeRef,\n overscan: 15,\n });\n\n const nativeScrollbar = useNativeScrollbar({\n nativeScrollbar: nativeScrollbarProp,\n client,\n });\n\n // Сколл к выбранному пункту при открытии меню\n useEffect(() => {\n if (open) {\n rowVirtualizer.scrollToIndex(highlightedIndex, { align: 'end' });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open]);\n\n useImperativeHandle(ctrlRef, () => rowVirtualizer, [rowVirtualizer]);\n\n // Циклическая навигация\n useEffect(() => {\n const notDisabled = (option: OptionShape) => !option.disabled;\n const firstNonDisabled = flatOptions.findIndex(notDisabled);\n const lastNonDisabled = flatOptions.findLastIndex(notDisabled);\n\n if (\n prevHighlightedIndex <= firstNonDisabled &&\n highlightedIndex === flatOptions.length - 1\n ) {\n rowVirtualizer.scrollToIndex(lastNonDisabled);\n }\n\n if (prevHighlightedIndex >= lastNonDisabled && highlightedIndex === 0) {\n rowVirtualizer.scrollToIndex(0);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [prevHighlightedIndex, highlightedIndex]);\n\n useEffect(() => {\n setVisibleOptionsInvalidateKey(\n /**\n * react-virtual может несколько раз отрендерить список с одним элементом,\n * поэтому нужно еще раз пересчитать высоту, когда список ВИДИМЫХ пунктов будет отрендерен полностью\n * Также, высоту нужно пересчитывать при изменении пунктов меню\n */\n rowVirtualizer.virtualItems\n .slice(0, Math.min(rowVirtualizer.virtualItems.length, visibleOptions + 1))\n .map((item) => flatOptions[item.index].key)\n .join('_'),\n );\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [rowVirtualizer.virtualItems.length, flatOptions]);\n\n const maxHeight = useVirtualVisibleOptions({\n visibleOptions,\n invalidate: visibleOptionsInvalidateKey,\n listRef,\n open,\n });\n\n // Т.к. рендерится плоский список, необходимо знать индекс, когда начинается новая группа\n const groupStartIndexes = useMemo(() => {\n let currentIndex = 0;\n\n return options.reduce((acc: { [key: number]: number }, option, index) => {\n if (isGroup(option)) {\n acc[currentIndex] = index;\n currentIndex += option.options.length;\n } else {\n currentIndex += 1;\n }\n\n return acc;\n }, {});\n }, [options]);\n\n const handleScroll: React.MouseEventHandler<HTMLDivElement> = (event) => {\n const scrolledToHeader = event.currentTarget.scrollTop <= 0;\n const scrolledToFooter =\n event.currentTarget.scrollHeight - event.currentTarget.offsetHeight <=\n event.currentTarget.scrollTop;\n\n setScrollTop(scrolledToHeader);\n setScrollBottom(scrolledToFooter);\n\n onScroll?.(event);\n };\n\n const renderList = () =>\n rowVirtualizer.virtualItems.map((virtualRow) => {\n const option = flatOptions[virtualRow.index];\n const renderGroup = () => {\n const group = options[groupStartIndexes[virtualRow.index]] as GroupShape;\n\n if (!group) return null;\n\n const groupSelectedItems = selectedItems?.filter(({ key: selectedItemKey }) =>\n group.options.some((opt) => opt.key === selectedItemKey),\n );\n const handleSelectedItems = (items: OptionShape[]) => {\n setSelectedItems(\n (\n selectedItems?.filter(\n ({ key: selectedItemKey }) =>\n !group.options.some((opt) => opt.key === selectedItemKey),\n ) ?? []\n ).concat(items),\n );\n };\n\n return (\n <Optgroup\n label={group.label}\n size={size}\n className={optionGroupClassName}\n options={group.options}\n selectedItems={groupSelectedItems}\n setSelectedItems={handleSelectedItems}\n search={search}\n multiple={multiple}\n {...groupOptionProps}\n />\n );\n };\n\n return (\n <div key={virtualRow.index} ref={virtualRow.measureRef}>\n {renderGroup()}\n {!isGroup(option) && (\n <Option {...getOptionProps(option, virtualRow.index)} />\n )}\n </div>\n );\n });\n\n const resetHighlightedIndex = () => setHighlightedIndex?.(-1);\n\n if (options.length === 0 && !emptyPlaceholder) {\n return null;\n }\n\n const [firstVirualRow] = rowVirtualizer.virtualItems;\n\n return (\n <div\n {...(nativeScrollbar && { 'data-test-id': dataTestId })}\n className={cn(styles.optionsList, styles[`size-${size}`], className)}\n >\n {header && (\n <div\n className={cn(styles.optionsListHeader, {\n [styles.headerHighlighted]: !scrollTop,\n })}\n onMouseEnter={resetHighlightedIndex}\n >\n {header}\n </div>\n )}\n\n {!noOptions && (\n <ScrollbarPrivate\n native={nativeScrollbar}\n className={scrollbarClassName}\n style={{ maxHeight }}\n scrollableNodeProps={{\n ref: scrollableNodeRef,\n onScroll: handleScroll,\n className: scrollableNodeClassName,\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n 'data-test-id': nativeScrollbar ? undefined : dataTestId,\n }}\n contentNodeProps={{\n className: contentNodeClassName,\n style: { minHeight: rowVirtualizer.totalSize },\n }}\n >\n <div\n className={cn(styles.list, listNodeClassName)}\n ref={listRef}\n style={{ transform: `translateY(${firstVirualRow?.start ?? 0}px)` }}\n >\n {renderList()}\n </div>\n </ScrollbarPrivate>\n )}\n\n {emptyPlaceholder && noOptions && (\n <div className={styles.emptyPlaceholder}>{emptyPlaceholder}</div>\n )}\n\n {showFooter && footer && (\n <div\n onMouseEnter={resetHighlightedIndex}\n className={cn(styles.optionsListFooter, footerClassName, {\n [styles.withBorder]:\n visibleOptions &&\n flatOptions.length > visibleOptions &&\n !scrollBottom,\n })}\n >\n {footer}\n </div>\n )}\n </div>\n );\n },\n);\n"],"names":["Optgroup","DefaultOptgroup"],"mappings":"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"}
@@ -2,7 +2,7 @@
2
2
  --gap-xs: 8px;
3
3
  --gap-8: var(--gap-xs);
4
4
  }
5
- .select__header_ymnkq {
5
+ .select__header_1hyu3 {
6
6
  padding-right: var(--gap-8);
7
7
  padding-left: var(--gap-8);
8
8
  }
@@ -1,6 +1,6 @@
1
1
  import './modal.mobile.css';
2
2
 
3
- var styles = {"header":"select__header_ymnkq"};
3
+ var styles = {"header":"select__header_1hyu3"};
4
4
 
5
5
  export { styles as default };
6
6
  //# sourceMappingURL=modal.mobile.module.css.js.map
@@ -94,6 +94,10 @@ export declare function useSelectWithApply({ options, selected, onChange, onSele
94
94
  search?: string;
95
95
  multiple?: boolean;
96
96
  limitDynamicOptionGroupSize?: BaseSelectProps["limitDynamicOptionGroupSize"];
97
+ scrollableNodeClassName?: string;
98
+ contentNodeClassName?: string;
99
+ listNodeClassName?: string;
100
+ ctrlRef?: import("react").Ref<import("../../typings").OptionsListController>;
97
101
  } & {
98
102
  showClear?: boolean;
99
103
  onClose?: () => void;
@@ -139,6 +143,10 @@ export declare function useSelectWithApply({ options, selected, onChange, onSele
139
143
  search?: string;
140
144
  multiple?: boolean;
141
145
  limitDynamicOptionGroupSize?: BaseSelectProps["limitDynamicOptionGroupSize"];
146
+ scrollableNodeClassName?: string;
147
+ contentNodeClassName?: string;
148
+ listNodeClassName?: string;
149
+ ctrlRef?: import("react").Ref<import("../../typings").OptionsListController>;
142
150
  } & import("react").RefAttributes<HTMLDivElement>> | undefined;
143
151
  showClear: boolean;
144
152
  onClear: () => void;
@@ -203,6 +211,10 @@ export declare function useSelectWithApply({ options, selected, onChange, onSele
203
211
  search?: string;
204
212
  multiple?: boolean;
205
213
  limitDynamicOptionGroupSize?: BaseSelectProps["limitDynamicOptionGroupSize"];
214
+ scrollableNodeClassName?: string;
215
+ contentNodeClassName?: string;
216
+ listNodeClassName?: string;
217
+ ctrlRef?: import("react").Ref<import("../../typings").OptionsListController>;
206
218
  } & import("react").RefAttributes<HTMLDivElement>> | undefined;
207
219
  optionsListProps: unknown;
208
220
  showClear: boolean;
@@ -35,6 +35,10 @@ export declare const OptionsListWithApply: React.ForwardRefExoticComponent<Pick<
35
35
  search?: string;
36
36
  multiple?: boolean;
37
37
  limitDynamicOptionGroupSize?: import("../../../typings").BaseSelectProps["limitDynamicOptionGroupSize"];
38
+ scrollableNodeClassName?: string;
39
+ contentNodeClassName?: string;
40
+ listNodeClassName?: string;
41
+ ctrlRef?: React.Ref<import("../../../typings").OptionsListController>;
38
42
  } & {
39
43
  showClear?: boolean;
40
44
  onClose?: () => void;
@@ -4,22 +4,17 @@
4
4
  :root {
5
5
  --gap-xs: 8px;
6
6
  --gap-s: 12px;
7
- --gap-m: 16px;
8
7
  --gap-8: var(--gap-xs);
9
8
  --gap-12: var(--gap-s);
10
- --gap-16: var(--gap-m);
11
9
  }
12
10
  :root {
13
11
  --select-option-list-footer-button-gap: var(--gap-8);
14
12
  }
15
- .select__footer_1mxu2 {
13
+ .select__footer_1bdq6 {
16
14
  background-color: var(--color-light-base-bg-primary);
17
15
  padding: var(--gap-12);
18
16
  outline: none;
19
17
  }
20
- .select__footer_1mxu2.select__size-72_1mxu2 {
21
- padding: var(--gap-12) var(--gap-16);
22
- }
23
- .select__footer_1mxu2 > .select__button_1mxu2 + .select__button_1mxu2 {
18
+ .select__footer_1bdq6 > .select__button_1bdq6 + .select__button_1bdq6 {
24
19
  margin-left: var(--select-option-list-footer-button-gap);
25
20
  }
@@ -1,6 +1,6 @@
1
1
  import './index.css';
2
2
 
3
- var styles = {"footer":"select__footer_1mxu2","size-72":"select__size-72_1mxu2","button":"select__button_1mxu2"};
3
+ var styles = {"footer":"select__footer_1bdq6","button":"select__button_1bdq6"};
4
4
 
5
5
  export { styles as default };
6
6
  //# sourceMappingURL=index.module.css.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.module.css.js","sources":["../../../../src/presets/useSelectWithApply/options-list-with-apply/footer/index.module.css"],"sourcesContent":["@import '@alfalab/core-components-vars/src/index.css';\n@import './vars.css';\n\n.footer {\n background-color: var(--color-light-base-bg-primary);\n padding: var(--gap-12);\n outline: none;\n\n &.size-72 {\n padding: var(--gap-12) var(--gap-16);\n }\n\n & > .button + .button {\n margin-left: var(--select-option-list-footer-button-gap);\n }\n}\n"],"names":[],"mappings":";;AAEgB,aAAe,CAAC,QAAQ,CAAC,sBAAsB,CAAC,SAAS,CAAC,uBAAuB,CAAC,QAAQ,CAAC,sBAAsB,CAAC;;;;"}
1
+ {"version":3,"file":"index.module.css.js","sources":["../../../../src/presets/useSelectWithApply/options-list-with-apply/footer/index.module.css"],"sourcesContent":["@import '@alfalab/core-components-vars/src/index.css';\n@import './vars.css';\n\n.footer {\n background-color: var(--color-light-base-bg-primary);\n padding: var(--gap-12);\n outline: none;\n\n & > .button + .button {\n margin-left: var(--select-option-list-footer-button-gap);\n }\n}\n"],"names":[],"mappings":";;AAEgB,aAAe,CAAC,QAAQ,CAAC,sBAAsB,CAAC,QAAQ,CAAC,sBAAsB,CAAC;;;;"}
@@ -1,21 +1,24 @@
1
1
  :root {
2
2
  --gap-xs: 8px;
3
3
  --gap-s: 12px;
4
- --gap-m: 16px;
4
+ --gap-0: 0px;
5
5
  --gap-8: var(--gap-xs);
6
6
  --gap-12: var(--gap-s);
7
- --gap-16: var(--gap-m);
8
7
  }
9
- .select__desktop_icdp3 {
10
- padding: var(--gap-12);
8
+ :root {
9
+ --select-options-list-top-padding: var(--gap-0);
10
+ --select-options-list-right-padding: var(--gap-0);
11
+ --select-options-list-left-padding: var(--gap-0);
12
+ }
13
+ .select__desktop_1h94k {
14
+ padding: calc(var(--gap-12) + var(--select-options-list-top-padding))
15
+ calc(var(--gap-12) + var(--select-options-list-right-padding)) var(--gap-12)
16
+ calc(var(--gap-12) + var(--select-options-list-left-padding));
11
17
  }
12
- .select__desktop_icdp3.select__size-72_icdp3 {
13
- padding-left: var(--gap-16);
14
- }
15
- .select__mobile_icdp3 {
18
+ .select__mobile_1h94k {
16
19
  padding: var(--gap-12) var(--gap-12) var(--gap-12) var(--gap-8);
17
20
  }
18
- .select__positionAfter_icdp3 {
21
+ .select__positionAfter_1h94k {
19
22
  margin-left: 0;
20
23
  margin-left: initial;
21
24
  }
@@ -1,6 +1,6 @@
1
1
  import './index.css';
2
2
 
3
- var styles = {"desktop":"select__desktop_icdp3","size-72":"select__size-72_icdp3","mobile":"select__mobile_icdp3","positionAfter":"select__positionAfter_icdp3"};
3
+ var styles = {"desktop":"select__desktop_1h94k","mobile":"select__mobile_1h94k","positionAfter":"select__positionAfter_1h94k"};
4
4
 
5
5
  export { styles as default };
6
6
  //# sourceMappingURL=index.module.css.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.module.css.js","sources":["../../../../src/presets/useSelectWithApply/options-list-with-apply/header/index.module.css"],"sourcesContent":["@import '@alfalab/core-components-vars/src/index.css';\n\n.desktop {\n padding: var(--gap-12);\n &.size-72 {\n padding-left: var(--gap-16);\n }\n}\n\n.mobile {\n padding: var(--gap-12) var(--gap-12) var(--gap-12) var(--gap-8);\n}\n\n.positionAfter {\n margin-left: unset;\n}\n"],"names":[],"mappings":";;AAEgB,aAAe,CAAC,SAAS,CAAC,uBAAuB,CAAC,SAAS,CAAC,uBAAuB,CAAC,QAAQ,CAAC,sBAAsB,CAAC,eAAe,CAAC,6BAA6B,CAAC;;;;"}
1
+ {"version":3,"file":"index.module.css.js","sources":["../../../../src/presets/useSelectWithApply/options-list-with-apply/header/index.module.css"],"sourcesContent":["@import '@alfalab/core-components-vars/src/index.css';\n@import '../../../../vars.css';\n\n.desktop {\n padding: calc(var(--gap-12) + var(--select-options-list-top-padding))\n calc(var(--gap-12) + var(--select-options-list-right-padding)) var(--gap-12)\n calc(var(--gap-12) + var(--select-options-list-left-padding));\n}\n\n.mobile {\n padding: var(--gap-12) var(--gap-12) var(--gap-12) var(--gap-8);\n}\n\n.positionAfter {\n margin-left: unset;\n}\n"],"names":[],"mappings":";;AAEgB,aAAe,CAAC,SAAS,CAAC,uBAAuB,CAAC,QAAQ,CAAC,sBAAsB,CAAC,eAAe,CAAC,6BAA6B,CAAC;;;;"}
@@ -1,4 +1,4 @@
1
- .select__skeleton_11n6n {
1
+ .select__skeleton_gcqox {
2
2
  position: absolute;
3
3
  top: 50%;
4
4
  transform: translateY(-50%);
@@ -1,6 +1,6 @@
1
1
  import './index.css';
2
2
 
3
- var styles = {"skeleton":"select__skeleton_11n6n"};
3
+ var styles = {"skeleton":"select__skeleton_gcqox"};
4
4
 
5
5
  export { styles as default };
6
6
  //# sourceMappingURL=index.module.css.js.map
@@ -1,7 +1,7 @@
1
1
  export { useSelectWithLoading } from '../presets/useSelectWithLoading/hook.js';
2
2
  export { useLazyLoading } from '../presets/useLazyLoading/hook.js';
3
3
  export { useSelectWithApply } from '../presets/useSelectWithApply/hook.js';
4
- export { defaultAccessor, defaultFilterFn, defaultGroupAccessor, getSelectTestIds, isGroup, isOptionShape, joinOptions, lastIndexOf, processOptions, usePrevious, useVirtualVisibleOptions, useVisibleOptions } from '../utils.js';
4
+ export { defaultAccessor, defaultFilterFn, defaultGroupAccessor, getSelectTestIds, isGroup, isOptionShape, joinOptions, processOptions, usePrevious, useVirtualVisibleOptions, useVisibleOptions } from '../utils.js';
5
5
  export { OptionDesktop } from '../components/option/desktop/Component.js';
6
6
  export { OptionMobile } from '../components/option/mobile/Component.js';
7
7
  export { OptionResponsive as Option } from '../components/option/Component.responsive.js';
package/esm/typings.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { type AriaAttributes, type ComponentType, type FC, type FocusEvent, type MouseEvent, type ReactElement, type ReactNode, type RefAttributes, type SVGProps } from 'react';
1
+ import { type AriaAttributes, type ComponentType, type FC, type FocusEvent, type MouseEvent, type ReactElement, type ReactNode, type Ref, type RefAttributes, type SVGProps } from 'react';
2
2
  import { type Environment } from 'downshift';
3
3
  import { type BottomSheetProps } from '@alfalab/core-components-bottom-sheet/esm';
4
4
  import { type FormControlProps } from '@alfalab/core-components-form-control/esm';
@@ -113,6 +113,7 @@ export interface BaseSelectProps {
113
113
  size?: FormControlProps['size'];
114
114
  /**
115
115
  * Размер пунктов меню
116
+ * @deprecated Управление размером пунктов меню через отдельный проп не поддерживается дизайн-контрактом. Размер пункта должен определяться его контентом.
116
117
  */
117
118
  optionsSize?: 40 | 48 | 56 | 64 | 72;
118
119
  /**
@@ -539,6 +540,22 @@ export type OptionsListProps = Pick<SelectProps, 'client'> & {
539
540
  * Ограничение динамического размера группы вариантов выбора
540
541
  */
541
542
  limitDynamicOptionGroupSize?: BaseSelectProps['limitDynamicOptionGroupSize'];
543
+ /**
544
+ *
545
+ */
546
+ scrollableNodeClassName?: string;
547
+ /**
548
+ *
549
+ */
550
+ contentNodeClassName?: string;
551
+ /**
552
+ *
553
+ */
554
+ listNodeClassName?: string;
555
+ /**
556
+ *
557
+ */
558
+ ctrlRef?: Ref<OptionsListController>;
542
559
  };
543
560
  export type OptgroupProps = {
544
561
  /**
@@ -789,4 +806,7 @@ export type ClearButtonProps = {
789
806
  */
790
807
  size?: FormControlProps['size'];
791
808
  };
809
+ export interface OptionsListController {
810
+ scrollToIndex(index: number): void;
811
+ }
792
812
  export {};
package/esm/utils.d.ts CHANGED
@@ -21,10 +21,6 @@ type useVisibleOptionsArgs = {
21
21
  * Реф на контейнер с пунтами меню
22
22
  */
23
23
  listRef: RefObject<HTMLElement>;
24
- /**
25
- * Реф на контейнер, которому нужно установить высоту
26
- */
27
- styleTargetRef?: RefObject<HTMLElement>;
28
24
  /**
29
25
  * Флаг открытия меню
30
26
  */
@@ -46,13 +42,12 @@ type useVisibleOptionsArgs = {
46
42
  */
47
43
  actualOptionsCount?: boolean;
48
44
  };
49
- export declare function useVirtualVisibleOptions({ visibleOptions, listRef, styleTargetRef, open, invalidate, options, size, actualOptionsCount, }: useVisibleOptionsArgs): void;
45
+ export declare function useVirtualVisibleOptions({ visibleOptions, listRef, open, invalidate, options, size, actualOptionsCount, }: useVisibleOptionsArgs): number | undefined;
50
46
  export declare function useVisibleOptions({ visibleOptions, listRef, open, options, size, actualOptionsCount, }: useVisibleOptionsArgs): readonly [boolean, number | undefined];
51
47
  export declare function defaultFilterFn(optionText: string, search: string): boolean;
52
48
  export declare function defaultGroupAccessor(option: GroupShape): string | undefined;
53
49
  export declare function defaultAccessor(option: OptionShape): string;
54
50
  export declare function usePrevious<T>(value: T): T | undefined;
55
- export declare const lastIndexOf: <T>(array: T[], predicate: (item: T) => boolean) => number;
56
51
  export declare function getSelectTestIds(dataTestId: string): {
57
52
  select: string;
58
53
  option: string;