@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
package/src/typings.ts CHANGED
@@ -6,6 +6,7 @@ import {
6
6
  type MouseEvent,
7
7
  type ReactElement,
8
8
  type ReactNode,
9
+ type Ref,
9
10
  type RefAttributes,
10
11
  type SVGProps,
11
12
  } from 'react';
@@ -155,6 +156,7 @@ export interface BaseSelectProps {
155
156
 
156
157
  /**
157
158
  * Размер пунктов меню
159
+ * @deprecated Управление размером пунктов меню через отдельный проп не поддерживается дизайн-контрактом. Размер пункта должен определяться его контентом.
158
160
  */
159
161
  optionsSize?: 40 | 48 | 56 | 64 | 72;
160
162
 
@@ -691,6 +693,26 @@ export type OptionsListProps = Pick<SelectProps, 'client'> & {
691
693
  * Ограничение динамического размера группы вариантов выбора
692
694
  */
693
695
  limitDynamicOptionGroupSize?: BaseSelectProps['limitDynamicOptionGroupSize'];
696
+
697
+ /**
698
+ *
699
+ */
700
+ scrollableNodeClassName?: string;
701
+
702
+ /**
703
+ *
704
+ */
705
+ contentNodeClassName?: string;
706
+
707
+ /**
708
+ *
709
+ */
710
+ listNodeClassName?: string;
711
+
712
+ /**
713
+ *
714
+ */
715
+ ctrlRef?: Ref<OptionsListController>;
694
716
  };
695
717
 
696
718
  export type OptgroupProps = {
@@ -1003,3 +1025,7 @@ export type ClearButtonProps = {
1003
1025
  */
1004
1026
  size?: FormControlProps['size'];
1005
1027
  };
1028
+
1029
+ export interface OptionsListController {
1030
+ scrollToIndex(index: number): void;
1031
+ }
package/src/utils.ts CHANGED
@@ -8,7 +8,12 @@ import {
8
8
  useState,
9
9
  } from 'react';
10
10
 
11
- import { fnUtils, getDataTestId, useIsMounted } from '@alfalab/core-components-shared';
11
+ import {
12
+ fnUtils,
13
+ getDataTestId,
14
+ getElementWindow,
15
+ useIsMounted,
16
+ } from '@alfalab/core-components-shared';
12
17
  import { useLayoutEffect_SAFE_FOR_SSR } from '@alfalab/hooks';
13
18
 
14
19
  import { DEFAULT_SEPARATOR } from './consts';
@@ -130,11 +135,6 @@ type useVisibleOptionsArgs = {
130
135
  */
131
136
  listRef: RefObject<HTMLElement>;
132
137
 
133
- /**
134
- * Реф на контейнер, которому нужно установить высоту
135
- */
136
- styleTargetRef?: RefObject<HTMLElement>;
137
-
138
138
  /**
139
139
  * Флаг открытия меню
140
140
  */
@@ -165,21 +165,21 @@ type useVisibleOptionsArgs = {
165
165
  export function useVirtualVisibleOptions({
166
166
  visibleOptions,
167
167
  listRef,
168
- styleTargetRef = listRef,
169
168
  open,
170
169
  invalidate,
171
170
  options,
172
171
  size,
173
172
  actualOptionsCount,
174
173
  }: useVisibleOptionsArgs) {
175
- useEffect(() => {
174
+ const [height, setHeight] = useState<number>();
175
+
176
+ useLayoutEffect_SAFE_FOR_SSR(() => {
176
177
  const measureOptionHeight = (element: HTMLElement) =>
177
178
  typeof size === 'number' ? Math.min(element.clientHeight, size) : element.clientHeight;
178
179
 
179
180
  const list = listRef.current;
180
- const styleTarget = styleTargetRef.current;
181
181
 
182
- if (open && list && styleTarget && visibleOptions > 0) {
182
+ if (open && list && visibleOptions > 0) {
183
183
  const childCount = list.children.length;
184
184
  const optionsNodes = ([] as HTMLElement[]).slice.call(
185
185
  list.children,
@@ -187,7 +187,7 @@ export function useVirtualVisibleOptions({
187
187
  visibleOptions + 1,
188
188
  );
189
189
 
190
- let height = optionsNodes
190
+ let nextHeight = optionsNodes
191
191
  .slice(0, visibleOptions)
192
192
  .reduce((acc, child) => acc + measureOptionHeight(child), 0);
193
193
 
@@ -197,7 +197,7 @@ export function useVirtualVisibleOptions({
197
197
  );
198
198
 
199
199
  // Если кол-во опций больше visibleOptions на 1, то показываем все опции, иначе добавляем половинку
200
- height += Math.round(
200
+ nextHeight += Math.round(
201
201
  childCount - visibleOptions === 1
202
202
  ? lastVisibleOptionHeight
203
203
  : lastVisibleOptionHeight / 2,
@@ -212,29 +212,28 @@ export function useVirtualVisibleOptions({
212
212
  0,
213
213
  );
214
214
 
215
- height =
215
+ nextHeight =
216
216
  Math.min(
217
217
  actualCount === 0 ? /** empty placeholder */ 1 : actualCount,
218
218
  visibleOptions,
219
219
  ) * size;
220
220
 
221
221
  if (visibleOptions < actualCount) {
222
- height += size / 2;
222
+ nextHeight += size / 2;
223
223
  }
224
224
  }
225
225
 
226
- styleTarget.style.height = `${height}px`;
226
+ const win = getElementWindow(list);
227
+
228
+ nextHeight += ['::before', '::after']
229
+ .map((pseudo) => parseFloat(win.getComputedStyle(list, pseudo).paddingTop) || 0)
230
+ .reduce((a, b) => a + b);
231
+
232
+ setHeight(nextHeight);
227
233
  }
228
- }, [
229
- actualOptionsCount,
230
- listRef,
231
- open,
232
- options,
233
- size,
234
- styleTargetRef,
235
- visibleOptions,
236
- invalidate,
237
- ]);
234
+ }, [actualOptionsCount, listRef, open, options, size, visibleOptions, invalidate]);
235
+
236
+ return height;
238
237
  }
239
238
 
240
239
  export function useVisibleOptions({
@@ -299,6 +298,12 @@ export function useVisibleOptions({
299
298
  }
300
299
  }
301
300
 
301
+ const win = getElementWindow(list);
302
+
303
+ measuredHeight += ['::before', '::after']
304
+ .map((pseudo) => parseFloat(win.getComputedStyle(list, pseudo).paddingTop) || 0)
305
+ .reduce((a, b) => a + b);
306
+
302
307
  setHeight(measuredHeight);
303
308
 
304
309
  setMeasured(true);
@@ -342,15 +347,6 @@ export function usePrevious<T>(value: T) {
342
347
  return ref.current;
343
348
  }
344
349
 
345
- // TODO: перенести
346
- export const lastIndexOf = <T>(array: T[], predicate: (item: T) => boolean) => {
347
- for (let i = array.length - 1; i >= 0; i--) {
348
- if (predicate(array[i])) return i;
349
- }
350
-
351
- return -1;
352
- };
353
-
354
350
  export function getSelectTestIds(dataTestId: string) {
355
351
  return {
356
352
  select: dataTestId,
package/src/vars.css CHANGED
@@ -11,7 +11,9 @@
11
11
  --select-options-list-box-shadow: var(--shadow-m);
12
12
  --select-options-list-offset: var(--gap-4);
13
13
  --select-options-list-top-padding: var(--gap-0);
14
+ --select-options-list-right-padding: var(--gap-0);
14
15
  --select-options-list-bottom-padding: var(--gap-0);
16
+ --select-options-list-left-padding: var(--gap-0);
15
17
  --select-options-list-empty-placeholder-color: var(--color-light-text-secondary);
16
18
  --select-option-divider-display: none;
17
19
  --select-option-divider-background: var(--color-light-neutral-400);
@@ -32,6 +34,7 @@
32
34
  --select-option-hover-color: var(--color-light-text-primary);
33
35
  --select-option-active-color: var(--color-light-text-primary);
34
36
  --select-option-disabled-color: var(--color-light-text-secondary);
37
+ --select-option-border-radius: var(--border-radius-0);
35
38
 
36
39
  /* checkmark */
37
40
 
package/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';
4
4
  import { type FormControlProps } from '@alfalab/core-components-form-control';
@@ -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/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;
package/utils.js CHANGED
@@ -82,23 +82,23 @@ function processOptions(options, selected, filterFn, filterGroup) {
82
82
  }
83
83
  // copy-paste of original `useVisibleOptions` before https://github.com/core-ds/core-components/pull/1368
84
84
  function useVirtualVisibleOptions(_a) {
85
- var visibleOptions = _a.visibleOptions, listRef = _a.listRef, _b = _a.styleTargetRef, styleTargetRef = _b === void 0 ? listRef : _b, open = _a.open, invalidate = _a.invalidate, options = _a.options, size = _a.size, actualOptionsCount = _a.actualOptionsCount;
86
- React.useEffect(function () {
85
+ var visibleOptions = _a.visibleOptions, listRef = _a.listRef, open = _a.open, invalidate = _a.invalidate, options = _a.options, size = _a.size, actualOptionsCount = _a.actualOptionsCount;
86
+ var _b = React.useState(), height = _b[0], setHeight = _b[1];
87
+ hooks.useLayoutEffect_SAFE_FOR_SSR(function () {
87
88
  var measureOptionHeight = function (element) {
88
89
  return typeof size === 'number' ? Math.min(element.clientHeight, size) : element.clientHeight;
89
90
  };
90
91
  var list = listRef.current;
91
- var styleTarget = styleTargetRef.current;
92
- if (open && list && styleTarget && visibleOptions > 0) {
92
+ if (open && list && visibleOptions > 0) {
93
93
  var childCount = list.children.length;
94
94
  var optionsNodes = [].slice.call(list.children, 0, visibleOptions + 1);
95
- var height = optionsNodes
95
+ var nextHeight = optionsNodes
96
96
  .slice(0, visibleOptions)
97
97
  .reduce(function (acc, child) { return acc + measureOptionHeight(child); }, 0);
98
98
  if (visibleOptions < childCount) {
99
99
  var lastVisibleOptionHeight = measureOptionHeight(optionsNodes[optionsNodes.length - 1]);
100
100
  // Если кол-во опций больше visibleOptions на 1, то показываем все опции, иначе добавляем половинку
101
- height += Math.round(childCount - visibleOptions === 1
101
+ nextHeight += Math.round(childCount - visibleOptions === 1
102
102
  ? lastVisibleOptionHeight
103
103
  : lastVisibleOptionHeight / 2);
104
104
  }
@@ -106,24 +106,20 @@ function useVirtualVisibleOptions(_a) {
106
106
  actualOptionsCount &&
107
107
  typeof size === 'number') {
108
108
  var actualCount = (options !== null && options !== void 0 ? options : []).reduce(function (sum, option) { return sum + 1 + (isGroup(option) ? option.options.length : 0); }, 0);
109
- height =
109
+ nextHeight =
110
110
  Math.min(actualCount === 0 ? /** empty placeholder */ 1 : actualCount, visibleOptions) * size;
111
111
  if (visibleOptions < actualCount) {
112
- height += size / 2;
112
+ nextHeight += size / 2;
113
113
  }
114
114
  }
115
- styleTarget.style.height = "".concat(height, "px");
115
+ var win_1 = coreComponentsShared.getElementWindow(list);
116
+ nextHeight += ['::before', '::after']
117
+ .map(function (pseudo) { return parseFloat(win_1.getComputedStyle(list, pseudo).paddingTop) || 0; })
118
+ .reduce(function (a, b) { return a + b; });
119
+ setHeight(nextHeight);
116
120
  }
117
- }, [
118
- actualOptionsCount,
119
- listRef,
120
- open,
121
- options,
122
- size,
123
- styleTargetRef,
124
- visibleOptions,
125
- invalidate,
126
- ]);
121
+ }, [actualOptionsCount, listRef, open, options, size, visibleOptions, invalidate]);
122
+ return height;
127
123
  }
128
124
  function useVisibleOptions(_a) {
129
125
  var visibleOptions = _a.visibleOptions, listRef = _a.listRef, open = _a.open, options = _a.options, size = _a.size, actualOptionsCount = _a.actualOptionsCount;
@@ -158,6 +154,10 @@ function useVisibleOptions(_a) {
158
154
  measuredHeight += size / 2;
159
155
  }
160
156
  }
157
+ var win_2 = coreComponentsShared.getElementWindow(list);
158
+ measuredHeight += ['::before', '::after']
159
+ .map(function (pseudo) { return parseFloat(win_2.getComputedStyle(list, pseudo).paddingTop) || 0; })
160
+ .reduce(function (a, b) { return a + b; });
161
161
  setHeight(measuredHeight);
162
162
  setMeasured(true);
163
163
  return function () {
@@ -191,14 +191,6 @@ function usePrevious(value) {
191
191
  }, [value]);
192
192
  return ref.current;
193
193
  }
194
- // TODO: перенести
195
- var lastIndexOf = function (array, predicate) {
196
- for (var i = array.length - 1; i >= 0; i--) {
197
- if (predicate(array[i]))
198
- return i;
199
- }
200
- return -1;
201
- };
202
194
  function getSelectTestIds(dataTestId) {
203
195
  return {
204
196
  select: dataTestId,
@@ -236,7 +228,6 @@ exports.getSelectTestIds = getSelectTestIds;
236
228
  exports.isGroup = isGroup;
237
229
  exports.isOptionShape = isOptionShape;
238
230
  exports.joinOptions = joinOptions;
239
- exports.lastIndexOf = lastIndexOf;
240
231
  exports.processOptions = processOptions;
241
232
  exports.usePrevious = usePrevious;
242
233
  exports.useVirtualVisibleOptions = useVirtualVisibleOptions;
package/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sources":["src/utils.ts"],"sourcesContent":["import {\n cloneElement,\n isValidElement,\n type ReactNode,\n type RefObject,\n useEffect,\n useRef,\n useState,\n} from 'react';\n\nimport { fnUtils, getDataTestId, useIsMounted } from '@alfalab/core-components-shared';\nimport { useLayoutEffect_SAFE_FOR_SSR } from '@alfalab/hooks';\n\nimport { DEFAULT_SEPARATOR } from './consts';\nimport {\n type BaseSelectProps,\n type GroupShape,\n type OptionShape,\n type OptionsListProps,\n} from './typings';\n\nexport const isGroup = (item: OptionShape | GroupShape): item is GroupShape =>\n Object.prototype.hasOwnProperty.call(item, 'options');\n\nexport const isOptionShape = (item: OptionShape | string | null): item is OptionShape =>\n !!item && Object.prototype.hasOwnProperty.call(item, 'key');\n\nexport const joinOptions = ({\n selected,\n selectedMultiple,\n valueSeparator = DEFAULT_SEPARATOR,\n}: {\n selected?: OptionShape;\n selectedMultiple?: OptionShape[];\n valueSeparator?: string;\n}) => {\n const options = selectedMultiple || (selected ? [selected] : []);\n\n if (!options.length) return null;\n\n return options.reduce((acc: Array<ReactNode | string>, option: OptionShape, index: number) => {\n if (isValidElement(option.content)) {\n acc.push(cloneElement(option.content, { key: option.key }));\n } else {\n acc.push(option.content);\n }\n\n if (index < options.length - 1) acc.push(valueSeparator);\n\n return acc;\n }, []);\n};\n\n// За один проход делает список пунктов меню плоским и находит выбранные пункты по ключу\nexport function processOptions(\n options: BaseSelectProps['options'],\n selected: BaseSelectProps['selected'] = [],\n filterFn: (option: OptionShape | GroupShape) => boolean = () => true,\n filterGroup = false,\n) {\n const flatOptions: OptionShape[] = [];\n const filteredOptions: BaseSelectProps['options'] = [];\n\n const selectedArray = Array.isArray(selected) ? selected : [selected];\n const selectedOptions = selectedArray.filter(isOptionShape);\n const selectedKeys = selectedArray.filter(\n (option): option is string => typeof option === 'string',\n );\n\n const isSelected = (option: OptionShape) => selectedKeys.includes(option.key);\n\n const process = (option: OptionShape | GroupShape) => {\n const isGroupOption = isGroup(option);\n\n if (!isGroupOption && isSelected(option)) {\n selectedOptions.push(option);\n }\n\n if (!filterFn(option)) return false;\n\n if (isGroupOption) {\n if (filterGroup) {\n Array.prototype.push.apply(flatOptions, option.options);\n }\n } else {\n flatOptions.push(option);\n }\n\n return true;\n };\n\n options.forEach((option) => {\n if (isGroup(option)) {\n const group: GroupShape = {\n ...option,\n options: [],\n };\n\n option.options.forEach((groupOption) => {\n const matched = process(groupOption);\n\n if (matched) group.options.push(groupOption);\n });\n\n if (group.options.length) {\n filteredOptions.push(group);\n\n return;\n }\n\n if (!filterGroup) return;\n }\n const matched = process(option);\n\n if (matched) filteredOptions.push(option);\n });\n\n return { filteredOptions, flatOptions, selectedOptions };\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\ntype useVisibleOptionsArgs = {\n /**\n * Количество видимых пунктов\n */\n visibleOptions: number;\n\n /**\n * Реф на контейнер с пунтами меню\n */\n listRef: RefObject<HTMLElement>;\n\n /**\n * Реф на контейнер, которому нужно установить высоту\n */\n styleTargetRef?: RefObject<HTMLElement>;\n\n /**\n * Флаг открытия меню\n */\n open?: boolean;\n\n /**\n * Позволяет вызвать пересчет высоты\n */\n invalidate?: unknown;\n\n /**\n * Список вариантов выбора\n */\n options?: Array<OptionShape | GroupShape>;\n\n /**\n * Максимальный размер варианта выбора\n */\n size?: Extract<OptionsListProps['size'], number>;\n\n /**\n * Учитывать действительное число вариантов выбора\n */\n actualOptionsCount?: boolean;\n};\n\n// copy-paste of original `useVisibleOptions` before https://github.com/core-ds/core-components/pull/1368\nexport function useVirtualVisibleOptions({\n visibleOptions,\n listRef,\n styleTargetRef = listRef,\n open,\n invalidate,\n options,\n size,\n actualOptionsCount,\n}: useVisibleOptionsArgs) {\n useEffect(() => {\n const measureOptionHeight = (element: HTMLElement) =>\n typeof size === 'number' ? Math.min(element.clientHeight, size) : element.clientHeight;\n\n const list = listRef.current;\n const styleTarget = styleTargetRef.current;\n\n if (open && list && styleTarget && visibleOptions > 0) {\n const childCount = list.children.length;\n const optionsNodes = ([] as HTMLElement[]).slice.call(\n list.children,\n 0,\n visibleOptions + 1,\n );\n\n let height = optionsNodes\n .slice(0, visibleOptions)\n .reduce((acc, child) => acc + measureOptionHeight(child), 0);\n\n if (visibleOptions < childCount) {\n const lastVisibleOptionHeight = measureOptionHeight(\n optionsNodes[optionsNodes.length - 1],\n );\n\n // Если кол-во опций больше visibleOptions на 1, то показываем все опции, иначе добавляем половинку\n height += Math.round(\n childCount - visibleOptions === 1\n ? lastVisibleOptionHeight\n : lastVisibleOptionHeight / 2,\n );\n } else if (\n visibleOptions > childCount &&\n actualOptionsCount &&\n typeof size === 'number'\n ) {\n const actualCount = (options ?? []).reduce(\n (sum, option) => sum + 1 + (isGroup(option) ? option.options.length : 0),\n 0,\n );\n\n height =\n Math.min(\n actualCount === 0 ? /** empty placeholder */ 1 : actualCount,\n visibleOptions,\n ) * size;\n\n if (visibleOptions < actualCount) {\n height += size / 2;\n }\n }\n\n styleTarget.style.height = `${height}px`;\n }\n }, [\n actualOptionsCount,\n listRef,\n open,\n options,\n size,\n styleTargetRef,\n visibleOptions,\n invalidate,\n ]);\n}\n\nexport function useVisibleOptions({\n visibleOptions,\n listRef,\n open,\n options,\n size,\n actualOptionsCount,\n}: useVisibleOptionsArgs) {\n const [, runIfMounted] = useIsMounted();\n const [measured, setMeasured] = useState(false);\n const [height, setHeight] = useState<number | undefined>();\n\n useLayoutEffect_SAFE_FOR_SSR(() => {\n const measureOptionHeight = (element: HTMLElement) =>\n typeof size === 'number' ? Math.min(element.clientHeight, size) : element.clientHeight;\n\n const list = listRef.current;\n\n if (open && list && visibleOptions > 0) {\n const childCount = list.children.length;\n const optionsNodes = ([] as HTMLElement[]).slice.call(\n list.children,\n 0,\n visibleOptions + 1,\n );\n\n let measuredHeight = optionsNodes\n .slice(0, visibleOptions)\n .reduce((acc, child) => acc + measureOptionHeight(child), 0);\n\n if (visibleOptions < childCount) {\n const lastVisibleOptionHeight = measureOptionHeight(\n optionsNodes[optionsNodes.length - 1],\n );\n\n // Если кол-во опций больше visibleOptions на 1, то показываем все опции, иначе добавляем половинку\n measuredHeight += Math.round(\n childCount - visibleOptions === 1\n ? lastVisibleOptionHeight\n : lastVisibleOptionHeight / 2,\n );\n } else if (\n visibleOptions > childCount &&\n actualOptionsCount &&\n typeof size === 'number'\n ) {\n const actualCount = (options ?? []).reduce(\n (sum, option) => sum + 1 + (isGroup(option) ? option.options.length : 0),\n 0,\n );\n\n measuredHeight =\n Math.min(\n actualCount === 0 ? /** empty placeholder */ 1 : actualCount,\n visibleOptions,\n ) * size;\n\n if (visibleOptions < actualCount) {\n measuredHeight += size / 2;\n }\n }\n\n setHeight(measuredHeight);\n\n setMeasured(true);\n\n return () => {\n runIfMounted(() => setMeasured(false));\n };\n }\n\n return fnUtils.noop;\n }, [actualOptionsCount, listRef, open, options, size, visibleOptions, runIfMounted]);\n\n return [measured, height] as const;\n}\n\nexport function defaultFilterFn(optionText: string, search: string) {\n if (!search) return true;\n\n return optionText.toLowerCase().includes(search.toLowerCase());\n}\n\nexport function defaultGroupAccessor(option: GroupShape) {\n return option.label;\n}\n\nexport function defaultAccessor(option: OptionShape) {\n if (typeof option.content === 'string') return option.content;\n if (typeof option.value === 'string') return option.value;\n\n return option.key;\n}\n\n// TODO: перенести\nexport function usePrevious<T>(value: T) {\n const ref = useRef<T>();\n\n useEffect(() => {\n ref.current = value;\n }, [value]);\n\n return ref.current;\n}\n\n// TODO: перенести\nexport const lastIndexOf = <T>(array: T[], predicate: (item: T) => boolean) => {\n for (let i = array.length - 1; i >= 0; i--) {\n if (predicate(array[i])) return i;\n }\n\n return -1;\n};\n\nexport function getSelectTestIds(dataTestId: string) {\n return {\n select: dataTestId,\n option: getDataTestId(dataTestId, 'option'),\n optionsList: getDataTestId(dataTestId, 'options-list'),\n clearButton: getDataTestId(dataTestId, 'options-list-clear'),\n applyButton: getDataTestId(dataTestId, 'options-list-apply'),\n field: getDataTestId(dataTestId, 'field'),\n fieldFormControl: getDataTestId(dataTestId, 'field-form-control'),\n fieldLeftAddons: getDataTestId(dataTestId, 'field-form-control-left-addons'),\n fieldRightAddons: getDataTestId(dataTestId, 'field-form-control-right-addons'),\n fieldError: getDataTestId(dataTestId, 'field-form-control-error-message'),\n fieldHint: getDataTestId(dataTestId, 'field-form-control-hint'),\n fieldClearIcon: getDataTestId(dataTestId, 'field-clear-icon'),\n searchInput: getDataTestId(dataTestId, 'search'),\n searchFormControl: getDataTestId(dataTestId, 'search-form-control'),\n searchInner: getDataTestId(dataTestId, 'search-form-control-inner'),\n searchLeftAddons: getDataTestId(dataTestId, 'search-form-control-left-addons'),\n searchRightAddons: getDataTestId(dataTestId, 'search-form-control-right-addons'),\n searchError: getDataTestId(dataTestId, 'search-form-control-error-message'),\n searchHint: getDataTestId(dataTestId, 'search-form-control-hint'),\n\n bottomSheet: getDataTestId(dataTestId, 'bottom-sheet'),\n bottomSheetHeader: getDataTestId(dataTestId, 'bottom-sheet-header'),\n bottomSheetContent: getDataTestId(dataTestId, 'bottom-sheet-content'),\n\n modal: getDataTestId(dataTestId, 'modal'),\n modalHeader: getDataTestId(dataTestId, 'modal-header'),\n modalContent: getDataTestId(dataTestId, 'modal-content'),\n };\n}\n"],"names":["DEFAULT_SEPARATOR","isValidElement","cloneElement","useEffect","useIsMounted","useState","useLayoutEffect_SAFE_FOR_SSR","fnUtils","useRef","getDataTestId"],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","sources":["src/utils.ts"],"sourcesContent":["import {\n cloneElement,\n isValidElement,\n type ReactNode,\n type RefObject,\n useEffect,\n useRef,\n useState,\n} from 'react';\n\nimport {\n fnUtils,\n getDataTestId,\n getElementWindow,\n useIsMounted,\n} from '@alfalab/core-components-shared';\nimport { useLayoutEffect_SAFE_FOR_SSR } from '@alfalab/hooks';\n\nimport { DEFAULT_SEPARATOR } from './consts';\nimport {\n type BaseSelectProps,\n type GroupShape,\n type OptionShape,\n type OptionsListProps,\n} from './typings';\n\nexport const isGroup = (item: OptionShape | GroupShape): item is GroupShape =>\n Object.prototype.hasOwnProperty.call(item, 'options');\n\nexport const isOptionShape = (item: OptionShape | string | null): item is OptionShape =>\n !!item && Object.prototype.hasOwnProperty.call(item, 'key');\n\nexport const joinOptions = ({\n selected,\n selectedMultiple,\n valueSeparator = DEFAULT_SEPARATOR,\n}: {\n selected?: OptionShape;\n selectedMultiple?: OptionShape[];\n valueSeparator?: string;\n}) => {\n const options = selectedMultiple || (selected ? [selected] : []);\n\n if (!options.length) return null;\n\n return options.reduce((acc: Array<ReactNode | string>, option: OptionShape, index: number) => {\n if (isValidElement(option.content)) {\n acc.push(cloneElement(option.content, { key: option.key }));\n } else {\n acc.push(option.content);\n }\n\n if (index < options.length - 1) acc.push(valueSeparator);\n\n return acc;\n }, []);\n};\n\n// За один проход делает список пунктов меню плоским и находит выбранные пункты по ключу\nexport function processOptions(\n options: BaseSelectProps['options'],\n selected: BaseSelectProps['selected'] = [],\n filterFn: (option: OptionShape | GroupShape) => boolean = () => true,\n filterGroup = false,\n) {\n const flatOptions: OptionShape[] = [];\n const filteredOptions: BaseSelectProps['options'] = [];\n\n const selectedArray = Array.isArray(selected) ? selected : [selected];\n const selectedOptions = selectedArray.filter(isOptionShape);\n const selectedKeys = selectedArray.filter(\n (option): option is string => typeof option === 'string',\n );\n\n const isSelected = (option: OptionShape) => selectedKeys.includes(option.key);\n\n const process = (option: OptionShape | GroupShape) => {\n const isGroupOption = isGroup(option);\n\n if (!isGroupOption && isSelected(option)) {\n selectedOptions.push(option);\n }\n\n if (!filterFn(option)) return false;\n\n if (isGroupOption) {\n if (filterGroup) {\n Array.prototype.push.apply(flatOptions, option.options);\n }\n } else {\n flatOptions.push(option);\n }\n\n return true;\n };\n\n options.forEach((option) => {\n if (isGroup(option)) {\n const group: GroupShape = {\n ...option,\n options: [],\n };\n\n option.options.forEach((groupOption) => {\n const matched = process(groupOption);\n\n if (matched) group.options.push(groupOption);\n });\n\n if (group.options.length) {\n filteredOptions.push(group);\n\n return;\n }\n\n if (!filterGroup) return;\n }\n const matched = process(option);\n\n if (matched) filteredOptions.push(option);\n });\n\n return { filteredOptions, flatOptions, selectedOptions };\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\ntype useVisibleOptionsArgs = {\n /**\n * Количество видимых пунктов\n */\n visibleOptions: number;\n\n /**\n * Реф на контейнер с пунтами меню\n */\n listRef: RefObject<HTMLElement>;\n\n /**\n * Флаг открытия меню\n */\n open?: boolean;\n\n /**\n * Позволяет вызвать пересчет высоты\n */\n invalidate?: unknown;\n\n /**\n * Список вариантов выбора\n */\n options?: Array<OptionShape | GroupShape>;\n\n /**\n * Максимальный размер варианта выбора\n */\n size?: Extract<OptionsListProps['size'], number>;\n\n /**\n * Учитывать действительное число вариантов выбора\n */\n actualOptionsCount?: boolean;\n};\n\n// copy-paste of original `useVisibleOptions` before https://github.com/core-ds/core-components/pull/1368\nexport function useVirtualVisibleOptions({\n visibleOptions,\n listRef,\n open,\n invalidate,\n options,\n size,\n actualOptionsCount,\n}: useVisibleOptionsArgs) {\n const [height, setHeight] = useState<number>();\n\n useLayoutEffect_SAFE_FOR_SSR(() => {\n const measureOptionHeight = (element: HTMLElement) =>\n typeof size === 'number' ? Math.min(element.clientHeight, size) : element.clientHeight;\n\n const list = listRef.current;\n\n if (open && list && visibleOptions > 0) {\n const childCount = list.children.length;\n const optionsNodes = ([] as HTMLElement[]).slice.call(\n list.children,\n 0,\n visibleOptions + 1,\n );\n\n let nextHeight = optionsNodes\n .slice(0, visibleOptions)\n .reduce((acc, child) => acc + measureOptionHeight(child), 0);\n\n if (visibleOptions < childCount) {\n const lastVisibleOptionHeight = measureOptionHeight(\n optionsNodes[optionsNodes.length - 1],\n );\n\n // Если кол-во опций больше visibleOptions на 1, то показываем все опции, иначе добавляем половинку\n nextHeight += Math.round(\n childCount - visibleOptions === 1\n ? lastVisibleOptionHeight\n : lastVisibleOptionHeight / 2,\n );\n } else if (\n visibleOptions > childCount &&\n actualOptionsCount &&\n typeof size === 'number'\n ) {\n const actualCount = (options ?? []).reduce(\n (sum, option) => sum + 1 + (isGroup(option) ? option.options.length : 0),\n 0,\n );\n\n nextHeight =\n Math.min(\n actualCount === 0 ? /** empty placeholder */ 1 : actualCount,\n visibleOptions,\n ) * size;\n\n if (visibleOptions < actualCount) {\n nextHeight += size / 2;\n }\n }\n\n const win = getElementWindow(list);\n\n nextHeight += ['::before', '::after']\n .map((pseudo) => parseFloat(win.getComputedStyle(list, pseudo).paddingTop) || 0)\n .reduce((a, b) => a + b);\n\n setHeight(nextHeight);\n }\n }, [actualOptionsCount, listRef, open, options, size, visibleOptions, invalidate]);\n\n return height;\n}\n\nexport function useVisibleOptions({\n visibleOptions,\n listRef,\n open,\n options,\n size,\n actualOptionsCount,\n}: useVisibleOptionsArgs) {\n const [, runIfMounted] = useIsMounted();\n const [measured, setMeasured] = useState(false);\n const [height, setHeight] = useState<number | undefined>();\n\n useLayoutEffect_SAFE_FOR_SSR(() => {\n const measureOptionHeight = (element: HTMLElement) =>\n typeof size === 'number' ? Math.min(element.clientHeight, size) : element.clientHeight;\n\n const list = listRef.current;\n\n if (open && list && visibleOptions > 0) {\n const childCount = list.children.length;\n const optionsNodes = ([] as HTMLElement[]).slice.call(\n list.children,\n 0,\n visibleOptions + 1,\n );\n\n let measuredHeight = optionsNodes\n .slice(0, visibleOptions)\n .reduce((acc, child) => acc + measureOptionHeight(child), 0);\n\n if (visibleOptions < childCount) {\n const lastVisibleOptionHeight = measureOptionHeight(\n optionsNodes[optionsNodes.length - 1],\n );\n\n // Если кол-во опций больше visibleOptions на 1, то показываем все опции, иначе добавляем половинку\n measuredHeight += Math.round(\n childCount - visibleOptions === 1\n ? lastVisibleOptionHeight\n : lastVisibleOptionHeight / 2,\n );\n } else if (\n visibleOptions > childCount &&\n actualOptionsCount &&\n typeof size === 'number'\n ) {\n const actualCount = (options ?? []).reduce(\n (sum, option) => sum + 1 + (isGroup(option) ? option.options.length : 0),\n 0,\n );\n\n measuredHeight =\n Math.min(\n actualCount === 0 ? /** empty placeholder */ 1 : actualCount,\n visibleOptions,\n ) * size;\n\n if (visibleOptions < actualCount) {\n measuredHeight += size / 2;\n }\n }\n\n const win = getElementWindow(list);\n\n measuredHeight += ['::before', '::after']\n .map((pseudo) => parseFloat(win.getComputedStyle(list, pseudo).paddingTop) || 0)\n .reduce((a, b) => a + b);\n\n setHeight(measuredHeight);\n\n setMeasured(true);\n\n return () => {\n runIfMounted(() => setMeasured(false));\n };\n }\n\n return fnUtils.noop;\n }, [actualOptionsCount, listRef, open, options, size, visibleOptions, runIfMounted]);\n\n return [measured, height] as const;\n}\n\nexport function defaultFilterFn(optionText: string, search: string) {\n if (!search) return true;\n\n return optionText.toLowerCase().includes(search.toLowerCase());\n}\n\nexport function defaultGroupAccessor(option: GroupShape) {\n return option.label;\n}\n\nexport function defaultAccessor(option: OptionShape) {\n if (typeof option.content === 'string') return option.content;\n if (typeof option.value === 'string') return option.value;\n\n return option.key;\n}\n\n// TODO: перенести\nexport function usePrevious<T>(value: T) {\n const ref = useRef<T>();\n\n useEffect(() => {\n ref.current = value;\n }, [value]);\n\n return ref.current;\n}\n\nexport function getSelectTestIds(dataTestId: string) {\n return {\n select: dataTestId,\n option: getDataTestId(dataTestId, 'option'),\n optionsList: getDataTestId(dataTestId, 'options-list'),\n clearButton: getDataTestId(dataTestId, 'options-list-clear'),\n applyButton: getDataTestId(dataTestId, 'options-list-apply'),\n field: getDataTestId(dataTestId, 'field'),\n fieldFormControl: getDataTestId(dataTestId, 'field-form-control'),\n fieldLeftAddons: getDataTestId(dataTestId, 'field-form-control-left-addons'),\n fieldRightAddons: getDataTestId(dataTestId, 'field-form-control-right-addons'),\n fieldError: getDataTestId(dataTestId, 'field-form-control-error-message'),\n fieldHint: getDataTestId(dataTestId, 'field-form-control-hint'),\n fieldClearIcon: getDataTestId(dataTestId, 'field-clear-icon'),\n searchInput: getDataTestId(dataTestId, 'search'),\n searchFormControl: getDataTestId(dataTestId, 'search-form-control'),\n searchInner: getDataTestId(dataTestId, 'search-form-control-inner'),\n searchLeftAddons: getDataTestId(dataTestId, 'search-form-control-left-addons'),\n searchRightAddons: getDataTestId(dataTestId, 'search-form-control-right-addons'),\n searchError: getDataTestId(dataTestId, 'search-form-control-error-message'),\n searchHint: getDataTestId(dataTestId, 'search-form-control-hint'),\n\n bottomSheet: getDataTestId(dataTestId, 'bottom-sheet'),\n bottomSheetHeader: getDataTestId(dataTestId, 'bottom-sheet-header'),\n bottomSheetContent: getDataTestId(dataTestId, 'bottom-sheet-content'),\n\n modal: getDataTestId(dataTestId, 'modal'),\n modalHeader: getDataTestId(dataTestId, 'modal-header'),\n modalContent: getDataTestId(dataTestId, 'modal-content'),\n };\n}\n"],"names":["DEFAULT_SEPARATOR","isValidElement","cloneElement","useState","useLayoutEffect_SAFE_FOR_SSR","getElementWindow","useIsMounted","fnUtils","useRef","useEffect","getDataTestId"],"mappings":"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"}
@@ -1,83 +0,0 @@
1
- :root {
2
- --color-light-neutral-300: #e7e8eb;
3
- --color-light-neutral-400: #d2d3d9;
4
- --color-light-text-secondary: rgba(4, 4, 19, 0.55);
5
- }
6
- :root {
7
- --gap-s: 12px;
8
- --gap-m: 16px;
9
- --gap-xl: 24px;
10
- --gap-0: 0px;
11
- --gap-12: var(--gap-s);
12
- --gap-16: var(--gap-m);
13
- --gap-24: var(--gap-xl);
14
- }
15
- :root {
16
- --select-options-list-empty-placeholder-color: var(--color-light-text-secondary);
17
- --select-option-divider-display: none;
18
- --select-option-divider-background: var(--color-light-neutral-400);
19
-
20
- --select-option-left-padding: var(--gap-12);
21
- --select-option-right-padding: var(--gap-12);
22
- }
23
- .select__virtualOptionsList_1oqav {
24
- width: 100%;
25
- outline: none;
26
- box-sizing: border-box;
27
- position: sticky;
28
- justify-content: space-between;
29
- }
30
- .select__virtualOptionsListHeader_1oqav {
31
- box-sizing: border-box;
32
- border-bottom: 1px solid var(--color-light-neutral-300);
33
- }
34
- .select__virtualOptionsListFooter_1oqav {
35
- position: sticky;
36
- bottom: var(--gap-0);
37
- box-sizing: border-box;
38
- border-top: 1px solid transparent;
39
- }
40
- .select__virtualOptionsListFooter_1oqav.select__withBorder_1oqav {
41
- border-top: 1px solid var(--color-light-neutral-300);
42
- }
43
- .select__scrollable_1oqav {
44
- position: relative;
45
- overflow: auto;
46
- width: 100%;
47
- }
48
- .select__inner_1oqav {
49
- position: relative;
50
- width: 100%;
51
- }
52
- .select__virtualRow_1oqav {
53
- position: absolute;
54
- top: var(--gap-0);
55
- left: var(--gap-0);
56
- width: 100%;
57
- }
58
- .select__virtualRow_1oqav:before {
59
- content: '';
60
- position: absolute;
61
- z-index: 1;
62
- left: var(--select-option-left-padding);
63
- right: var(--select-option-right-padding);
64
- top: var(--gap-0);
65
- height: 1px;
66
- background: var(--select-option-divider-background);
67
- display: var(--select-option-divider-display);
68
- }
69
- .select__virtualRow_1oqav:first-child:before {
70
- display: none;
71
- }
72
- .select__highlighted_1oqav:before,
73
- .select__highlighted_1oqav + .select__virtualRow_1oqav:before {
74
- display: none;
75
- }
76
- .select__emptyPlaceholder_1oqav {
77
- padding: var(--gap-16) var(--gap-12);
78
- color: var(--select-options-list-empty-placeholder-color);
79
- flex: 1;
80
- }
81
- .select__size-72_1oqav .select__emptyPlaceholder_1oqav {
82
- padding: var(--gap-24) var(--gap-16);
83
- }
@@ -1,8 +0,0 @@
1
- 'use strict';
2
-
3
- require('./index.css');
4
-
5
- var styles = {"virtualOptionsList":"select__virtualOptionsList_1oqav","virtualOptionsListHeader":"select__virtualOptionsListHeader_1oqav","virtualOptionsListFooter":"select__virtualOptionsListFooter_1oqav","withBorder":"select__withBorder_1oqav","scrollable":"select__scrollable_1oqav","inner":"select__inner_1oqav","virtualRow":"select__virtualRow_1oqav","highlighted":"select__highlighted_1oqav","emptyPlaceholder":"select__emptyPlaceholder_1oqav","size-72":"select__size-72_1oqav"};
6
-
7
- module.exports = styles;
8
- //# sourceMappingURL=index.module.css.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.module.css.js","sources":["../../src/components/virtual-options-list/index.module.css"],"sourcesContent":["@import '@alfalab/core-components-vars/src/index.css';\n@import '../../vars.css';\n\n.virtualOptionsList {\n width: 100%;\n outline: none;\n box-sizing: border-box;\n position: sticky;\n justify-content: space-between;\n}\n\n.virtualOptionsListHeader {\n box-sizing: border-box;\n border-bottom: 1px solid var(--color-light-neutral-300);\n}\n\n.virtualOptionsListFooter {\n position: sticky;\n bottom: var(--gap-0);\n box-sizing: border-box;\n border-top: 1px solid transparent;\n\n &.withBorder {\n border-top: 1px solid var(--color-light-neutral-300);\n }\n}\n\n.scrollable {\n position: relative;\n overflow: auto;\n width: 100%;\n}\n\n.inner {\n position: relative;\n width: 100%;\n}\n\n.virtualRow {\n position: absolute;\n top: var(--gap-0);\n left: var(--gap-0);\n width: 100%;\n\n &:before {\n content: '';\n position: absolute;\n z-index: 1;\n left: var(--select-option-left-padding);\n right: var(--select-option-right-padding);\n top: var(--gap-0);\n height: 1px;\n background: var(--select-option-divider-background);\n display: var(--select-option-divider-display);\n }\n\n &:first-child:before {\n display: none;\n }\n}\n\n.highlighted {\n &:before,\n & + .virtualRow:before {\n display: none;\n }\n}\n\n.emptyPlaceholder {\n padding: var(--gap-16) var(--gap-12);\n color: var(--select-options-list-empty-placeholder-color);\n flex: 1;\n}\n\n.size-72 .emptyPlaceholder {\n padding: var(--gap-24) var(--gap-16);\n}\n"],"names":[],"mappings":";;;;AAEgB,aAAe,CAAC,oBAAoB,CAAC,kCAAkC,CAAC,0BAA0B,CAAC,wCAAwC,CAAC,0BAA0B,CAAC,wCAAwC,CAAC,YAAY,CAAC,0BAA0B,CAAC,YAAY,CAAC,0BAA0B,CAAC,OAAO,CAAC,qBAAqB,CAAC,YAAY,CAAC,0BAA0B,CAAC,aAAa,CAAC,2BAA2B,CAAC,kBAAkB,CAAC,gCAAgC,CAAC,SAAS,CAAC,uBAAuB,CAAC;;;;"}