@hh.ru/magritte-ui-picker-wheel 1.0.3 → 1.0.5

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.
package/PickerWheel.js CHANGED
@@ -1,15 +1,18 @@
1
1
  import './index.css';
2
2
  import { jsxs, jsx } from 'react/jsx-runtime';
3
- import { useRef, useState, useEffect, useCallback, useLayoutEffect, useMemo } from 'react';
3
+ import { useRef, useContext, useState, useEffect, useCallback, useLayoutEffect } from 'react';
4
4
  import classnames from 'classnames';
5
5
  import { initScrollHandlers } from '@hh.ru/magritte-internal-custom-scroll';
6
+ import { BottomSheetContext } from '@hh.ru/magritte-ui-bottom-sheet';
6
7
  import { useBreakpoint } from '@hh.ru/magritte-ui-breakpoint';
7
8
 
8
- var styles = {"picker-wheel":"magritte-picker-wheel___VaPvG_1-0-3","pickerWheel":"magritte-picker-wheel___VaPvG_1-0-3","selected-item-background":"magritte-selected-item-background___UnBPm_1-0-3","selectedItemBackground":"magritte-selected-item-background___UnBPm_1-0-3","columns":"magritte-columns___I7bCB_1-0-3","touch-events-overlay":"magritte-touch-events-overlay___c3YOp_1-0-3","touchEventsOverlay":"magritte-touch-events-overlay___c3YOp_1-0-3","fixed-height":"magritte-fixed-height___BLw9W_1-0-3","fixedHeight":"magritte-fixed-height___BLw9W_1-0-3","column-wrapper":"magritte-column-wrapper___yRwai_1-0-3","columnWrapper":"magritte-column-wrapper___yRwai_1-0-3","circular-column-wrapper":"magritte-circular-column-wrapper___4KG7c_1-0-3","circularColumnWrapper":"magritte-circular-column-wrapper___4KG7c_1-0-3","wide-column-wrapper":"magritte-wide-column-wrapper___nvecx_1-0-3","wideColumnWrapper":"magritte-wide-column-wrapper___nvecx_1-0-3","full-width-column-wrapper":"magritte-full-width-column-wrapper___oxhh1_1-0-3","fullWidthColumnWrapper":"magritte-full-width-column-wrapper___oxhh1_1-0-3","column":"magritte-column___IMYca_1-0-3","item":"magritte-item___4RQVs_1-0-3","align-left":"magritte-align-left___PXJt0_1-0-3","alignLeft":"magritte-align-left___PXJt0_1-0-3","align-right":"magritte-align-right___0yc2S_1-0-3","alignRight":"magritte-align-right___0yc2S_1-0-3","disabled":"magritte-disabled___d3ukm_1-0-3","selected":"magritte-selected___Nar3H_1-0-3"};
9
+ var styles = {"picker-wheel":"magritte-picker-wheel___VaPvG_1-0-5","pickerWheel":"magritte-picker-wheel___VaPvG_1-0-5","selected-item-background":"magritte-selected-item-background___UnBPm_1-0-5","selectedItemBackground":"magritte-selected-item-background___UnBPm_1-0-5","columns":"magritte-columns___I7bCB_1-0-5","touch-events-overlay":"magritte-touch-events-overlay___c3YOp_1-0-5","touchEventsOverlay":"magritte-touch-events-overlay___c3YOp_1-0-5","fixed-height":"magritte-fixed-height___BLw9W_1-0-5","fixedHeight":"magritte-fixed-height___BLw9W_1-0-5","column-wrapper":"magritte-column-wrapper___yRwai_1-0-5","columnWrapper":"magritte-column-wrapper___yRwai_1-0-5","column-position-wrapper":"magritte-column-position-wrapper___wQTIu_1-0-5","columnPositionWrapper":"magritte-column-position-wrapper___wQTIu_1-0-5","wide-column-wrapper":"magritte-wide-column-wrapper___nvecx_1-0-5","wideColumnWrapper":"magritte-wide-column-wrapper___nvecx_1-0-5","full-width-column-wrapper":"magritte-full-width-column-wrapper___oxhh1_1-0-5","fullWidthColumnWrapper":"magritte-full-width-column-wrapper___oxhh1_1-0-5","column":"magritte-column___IMYca_1-0-5","item":"magritte-item___4RQVs_1-0-5","align-left":"magritte-align-left___PXJt0_1-0-5","alignLeft":"magritte-align-left___PXJt0_1-0-5","align-right":"magritte-align-right___0yc2S_1-0-5","alignRight":"magritte-align-right___0yc2S_1-0-5","disabled":"magritte-disabled___d3ukm_1-0-5","selected":"magritte-selected___Nar3H_1-0-5"};
9
10
 
11
+ const FIXED_HEIGHT_ITEMS = 7;
10
12
  const ITEM_HEIGHT = 48;
11
13
  const COLUMN_WIDTH = 64;
12
14
  const WIDE_COLUMN_WIDTH = 105;
15
+ const SELECTED_ITEM_SCALE = 22 / 18;
13
16
  /**
14
17
  * Превращает массив точек в массив интервалов
15
18
  * [0, 50, 100, 200] => [{ left: 0, right: 50 }, { left: 50, right: 100 }, { left: 100, right: 200 }]
@@ -50,247 +53,307 @@ const makeScrollAreas = (columnCount, containerWidth, showDelimiter) => {
50
53
  throw new Error('Unexpected column count');
51
54
  }
52
55
  };
56
+ const floorToOdd = (value) => (value % 2 !== 1 ? value - 1 : value);
53
57
  const range = (start, end) => {
54
58
  return [...Array(end - start).keys()].map((_, index) => index + start);
55
59
  };
56
60
  const translateY = (value) => `translate3d(0, ${value}px, 0)`;
57
- const useArrayOfRefs = (length) => {
58
- const refs = useRef([]);
59
- const refCallbacks = useMemo(() => {
60
- return [...Array(length).keys()].map((index) => {
61
- return (element) => {
62
- refs.current[index] = element;
63
- };
64
- });
65
- }, [length]);
66
- return [refs, refCallbacks];
67
- };
68
61
  const makeInitialState = (columns) => {
69
62
  return {
70
- activeColumnsIndex: null,
63
+ activeColumnIndex: null,
71
64
  animations: [],
72
65
  containerMetrics: null,
73
- columns: columns.map((column) => ({
74
- circular: column.circular,
75
- firstCloneIndex: 0,
76
- lastCloneIndex: 0,
77
- itemCount: column.items.length,
78
- translateY: 0,
79
- translateYCorrection: null,
80
- })),
66
+ columns: columns.map((column) => {
67
+ const itemElementCallbacks = new Map();
68
+ const columnState = {
69
+ circular: column.circular,
70
+ cloneCount: 1,
71
+ disabledItems: new Set(),
72
+ itemCount: column.items.length,
73
+ translateY: 0,
74
+ visibleItemCount: null,
75
+ columnElement: null,
76
+ columnElementCallback: (element) => (columnState.columnElement = element),
77
+ columnWrapper: null,
78
+ columnWrapperCallback: (element) => (columnState.columnWrapper = element),
79
+ itemElements: new Map(),
80
+ itemElementCallbacks: {
81
+ get: (itemIndex) => {
82
+ if (!itemElementCallbacks.has(itemIndex)) {
83
+ itemElementCallbacks.set(itemIndex, (element) => {
84
+ columnState.itemElements.set(itemIndex, element);
85
+ });
86
+ }
87
+ return itemElementCallbacks.get(itemIndex);
88
+ },
89
+ },
90
+ };
91
+ return columnState;
92
+ }),
81
93
  scrollAreas: null,
94
+ scrollDirection: null,
82
95
  };
83
96
  };
84
97
  const PickerWheel = ({ columns, fixedHeight, onChange, selectedIndexes, showDelimiter, }) => {
98
+ if (columns.length !== selectedIndexes.length) {
99
+ throw new Error('selectedIndexes.length does not match columns.length');
100
+ }
85
101
  const stateRef = useRef(makeInitialState(columns));
86
- const [stateKey, setStateKey] = useState(0);
102
+ if (columns.length !== stateRef.current.columns.length ||
103
+ columns.some((column, columnIndex) => {
104
+ return (column.items.length !== stateRef.current.columns[columnIndex].itemCount ||
105
+ column.circular !== stateRef.current.columns[columnIndex].circular);
106
+ })) {
107
+ stateRef.current = makeInitialState(columns);
108
+ }
109
+ columns.forEach((column, columnIndex) => (stateRef.current.columns[columnIndex].disabledItems = new Set(column.items.reduce((result, item, itemIndex) => (item.disabled ? [...result, itemIndex] : result), []))));
110
+ const bottomSheetContext = useContext(BottomSheetContext);
87
111
  const containerRef = useRef(null);
112
+ const isFixedHeight = bottomSheetContext.height !== 'full-screen' || fixedHeight;
88
113
  const onChangeRef = useRef(onChange);
89
114
  onChangeRef.current = onChange;
90
115
  const selectedIndexesRef = useRef(selectedIndexes);
91
116
  selectedIndexesRef.current = selectedIndexes;
117
+ const [_, setStateKey] = useState(0);
118
+ const [touchActionActive, setTouchActionActive] = useState(false);
92
119
  const visible = useBreakpoint().isMobile;
93
- const [columnWrapperRefs, columnWrapperRefCallbacks] = useArrayOfRefs(columns.length);
94
- const [columnRefs, columnRefCallbacks] = useArrayOfRefs(columns.length);
95
120
  useEffect(() => {
96
121
  const container = containerRef.current;
97
122
  if (!container) {
98
123
  return void 0;
99
124
  }
100
125
  // вычисляем колонку, которую пользователь начал скроллить
101
- const handleTouchStart = (event) => {
102
- event.preventDefault();
103
- event.stopPropagation();
104
- if (event.changedTouches.length === 1 && stateRef.current.containerMetrics !== null) {
105
- stateRef.current.activeColumnsIndex =
126
+ const setActiveColumn = (clientX) => {
127
+ const containerMetrics = stateRef.current.containerMetrics;
128
+ if (containerMetrics !== null) {
129
+ stateRef.current.activeColumnIndex =
106
130
  stateRef.current.scrollAreas?.findIndex((interval) => {
107
- const relativeX = event.changedTouches[0].clientX - stateRef.current.containerMetrics.left;
131
+ const relativeX = clientX - containerMetrics.left;
108
132
  return relativeX >= interval.left && relativeX <= interval.right;
109
133
  }) ?? null;
110
134
  }
111
135
  };
112
- // предотвращаем скролл боттомшита
136
+ const handleTouchStart = (event) => {
137
+ event.preventDefault();
138
+ event.stopPropagation();
139
+ event.changedTouches.length === 1 && setActiveColumn(event.changedTouches[0].clientX);
140
+ };
113
141
  const handleTouchMove = (event) => {
114
142
  event.preventDefault();
115
143
  event.stopPropagation();
116
144
  };
145
+ const handleWheel = (event) => {
146
+ event.preventDefault();
147
+ event.stopPropagation();
148
+ setActiveColumn(event.clientX);
149
+ };
117
150
  container.addEventListener('touchstart', handleTouchStart, { passive: false });
118
151
  container.addEventListener('touchmove', handleTouchMove, { passive: false });
152
+ container.addEventListener('wheel', handleWheel, { passive: false });
119
153
  return () => {
120
154
  container.removeEventListener('touchstart', handleTouchStart);
121
155
  container.removeEventListener('touchmove', handleTouchMove);
156
+ container.removeEventListener('wheel', handleWheel);
122
157
  };
123
158
  }, []);
124
- /**
125
- * Верхний край колонки близко к верхнему краю враппера — клонируем айтемы сверху
126
- * */
127
- const cloneItemsBefore = useCallback((columnState) => {
128
- if (columnState.translateY > -100) {
129
- columnState.firstCloneIndex -= 1;
130
- columnState.translateYCorrection = -columnState.itemCount * ITEM_HEIGHT;
131
- setStateKey((stateKey) => stateKey + 1);
132
- }
133
- }, [setStateKey]);
134
- /**
135
- * Нижний край колонки близко к нижнему краю враппера – клонируем айтемы снизу
136
- * */
137
- const cloneItemsAfter = useCallback((columnState, columnElement, columnWrapper) => {
138
- if (columnElement.clientHeight + columnState.translateY - columnWrapper.clientHeight < 100) {
139
- columnState.lastCloneIndex += 1;
140
- setStateKey((stateKey) => stateKey + 1);
141
- }
142
- }, [setStateKey]);
143
159
  useEffect(() => {
144
- return initScrollHandlers({
145
- axis: 'vertical',
146
- wrapperRef: containerRef,
147
- onTouchMove: (event) => {
148
- // TODO cache layout metrics
149
- if (stateRef.current.activeColumnsIndex !== null) {
150
- const columnIndex = stateRef.current.activeColumnsIndex;
151
- const columnState = stateRef.current?.columns[columnIndex];
152
- const columnElement = columnRefs.current?.[columnIndex];
153
- const columnWrapper = columnWrapperRefs.current?.[columnIndex];
154
- if (!columnState || !columnElement || !columnWrapper) {
155
- return;
160
+ const handleScroll = (event) => {
161
+ if (stateRef.current.activeColumnIndex !== null && stateRef.current.containerMetrics !== null) {
162
+ const columnIndex = stateRef.current.activeColumnIndex;
163
+ const columnState = stateRef.current?.columns[columnIndex];
164
+ const { columnElement, columnWrapper } = columnState;
165
+ if (!columnState || !columnState.visibleItemCount || !columnElement || !columnWrapper) {
166
+ return;
167
+ }
168
+ stateRef.current.scrollDirection = event.delta > 0 ? 'up' : 'down';
169
+ columnState.translateY += event.delta;
170
+ // бесконечный скролл
171
+ if (columnState.circular) {
172
+ // скролл вверх
173
+ // верхний край колонки близко к верхнему краю враппера
174
+ if (event.delta > 0 &&
175
+ stateRef.current.containerMetrics.height / 2 + columnState.translateY > -100) {
176
+ columnState.translateY -= columnState.itemCount * ITEM_HEIGHT;
156
177
  }
157
- columnState.translateY += event.delta;
158
- // бесконечный скролл добавляем айтемы по мере необходимости
159
- if (columnState.circular) {
160
- // скролл вверх
161
- if (event.delta > 0) {
162
- cloneItemsBefore(columnState);
163
- }
164
- // скролл вниз
165
- if (event.delta < 0) {
166
- cloneItemsAfter(columnState, columnElement, columnWrapper);
167
- }
178
+ // скролл вниз
179
+ // нижний край колонки близко к нижнему краю враппера
180
+ if (event.delta < 0 &&
181
+ columnState.cloneCount * columnState.itemCount * ITEM_HEIGHT +
182
+ columnState.translateY -
183
+ stateRef.current.containerMetrics.height / 2 <
184
+ 100) {
185
+ columnState.translateY += columnState.itemCount * ITEM_HEIGHT;
168
186
  }
169
- // скролл ограничен — делаем чтобы колонку было нельзя проскроллить за допустимые границы
170
- if (!columnState.circular) {
171
- // скролл вверх
172
- if (event.delta > 0) {
173
- // translateY, когда колонка проскроллена в самый верх (выбран первый айтем)
174
- const minAllowedTranslateY = columnWrapper.clientHeight / 2 - ITEM_HEIGHT / 2;
175
- columnState.translateY = Math.min(columnState.translateY, minAllowedTranslateY);
187
+ }
188
+ // скролл ограничен — делаем чтобы колонку было нельзя проскроллить за допустимые границы
189
+ if (!columnState.circular) {
190
+ // скролл вверх
191
+ if (event.delta > 0) {
192
+ // translateY, когда колонка проскроллена в самый верх (выбран первый айтем)
193
+ const minAllowedTranslateY = 0;
194
+ columnState.translateY = Math.min(columnState.translateY, minAllowedTranslateY);
195
+ }
196
+ // скролл вниз
197
+ if (event.delta < 0) {
198
+ // translateY, когда колонка проскроллена в самый низ (выбран последний айтем)
199
+ const maxAllowedTranslateY = (columnState.itemCount - 1) * ITEM_HEIGHT;
200
+ columnState.translateY = Math.max(columnState.translateY, -maxAllowedTranslateY);
201
+ }
202
+ }
203
+ // анимация увеличения ближайшего к центру айтема
204
+ const selectedItemIndex = Math.round(-columnState.translateY / ITEM_HEIGHT);
205
+ if (columnState.itemElements.has(selectedItemIndex)) {
206
+ const halfItemHeight = ITEM_HEIGHT / 2;
207
+ columnState.itemElements.get(selectedItemIndex).style.transform =
208
+ `scale(${1 + (SELECTED_ITEM_SCALE - 1) * Math.abs((Math.abs(columnState.translateY % ITEM_HEIGHT) - halfItemHeight) / halfItemHeight)})`;
209
+ }
210
+ columnElement.style.transform = translateY(columnState.translateY);
211
+ setTouchActionActive(true);
212
+ }
213
+ };
214
+ const handleScrollEnd = () => {
215
+ if (stateRef.current.activeColumnIndex !== null) {
216
+ const columnIndex = stateRef.current.activeColumnIndex;
217
+ const columnState = stateRef.current?.columns[columnIndex];
218
+ const { columnElement, columnWrapper } = columnState;
219
+ if (!columnState || !columnElement || !columnWrapper) {
220
+ return;
221
+ }
222
+ // если колонка зациклена, у нее могут быть отрендерены клоны для бесконечного скролла
223
+ // поэтому нужно взять остаток от деления на количество айтемов в колонке
224
+ const _selectedItemIndex = Math.round(Math.abs(columnState.translateY) / ITEM_HEIGHT) % columnState.itemCount;
225
+ let selectedItemIndex = _selectedItemIndex;
226
+ // если выбранный айтем disabled, ищем ближайший не disabled в направлении скролла
227
+ if (columnState.disabledItems.has(selectedItemIndex)) {
228
+ do {
229
+ if (stateRef.current.scrollDirection === 'up') {
230
+ selectedItemIndex -= 1;
231
+ if (selectedItemIndex < 0) {
232
+ selectedItemIndex = columnState.itemCount - 1;
233
+ }
176
234
  }
177
- // скролл вниз
178
- if (event.delta < 0) {
179
- // translateY, когда колонка проскроллена в самый низ (выбран последний айтем)
180
- const maxAllowedTranslateY = columnWrapper.clientHeight / 2 - columnElement.clientHeight + ITEM_HEIGHT / 2;
181
- columnState.translateY = Math.max(columnState.translateY, maxAllowedTranslateY);
235
+ else if (stateRef.current.scrollDirection === 'down') {
236
+ selectedItemIndex += 1;
237
+ if (selectedItemIndex > columnState.itemCount - 1) {
238
+ selectedItemIndex = 0;
239
+ }
182
240
  }
183
- }
184
- columnElement.style.transform = translateY(columnState.translateY);
241
+ else {
242
+ break;
243
+ }
244
+ } while (columnState.disabledItems.has(selectedItemIndex) &&
245
+ selectedItemIndex !== _selectedItemIndex);
185
246
  }
186
- },
187
- onTouchEnd: () => {
188
- if (stateRef.current.activeColumnsIndex !== null) {
189
- const columnIndex = stateRef.current.activeColumnsIndex;
190
- const columnState = stateRef.current?.columns[columnIndex];
191
- const columnElement = columnRefs.current?.[columnIndex];
192
- const columnWrapper = columnWrapperRefs.current?.[columnIndex];
193
- if (!columnState || !columnElement || !columnWrapper) {
194
- return;
195
- }
196
- if (columnState.translateYCorrection !== null) ;
197
- // TODO запретить останавливать скролл на disabled айтемах
198
- // translateY, когда колонка проскроллена в самый верх (выбран первый айтем)
199
- const minAllowedTranslateY = columnWrapper.clientHeight / 2 - ITEM_HEIGHT / 2;
200
- const _selectedItemIndex = Math.round((minAllowedTranslateY - columnState.translateY) / ITEM_HEIGHT);
201
- // если колонка зациклена, у нее могут быть отрендерены клоны для бесконечного скролла
202
- // поэтому нужно взять остаток от деления на количество айтемов в колонке
203
- const selectedItemIndex = _selectedItemIndex % columnState.itemCount;
204
- const _selectedIndexes = [...selectedIndexesRef.current];
205
- _selectedIndexes[columnIndex] = selectedItemIndex;
206
- onChangeRef.current?.(_selectedIndexes);
207
- stateRef.current.activeColumnsIndex = null;
247
+ const _selectedIndexes = [...selectedIndexesRef.current];
248
+ _selectedIndexes[columnIndex] = selectedItemIndex;
249
+ onChangeRef.current?.(_selectedIndexes);
250
+ stateRef.current.activeColumnIndex = null;
251
+ stateRef.current.scrollDirection = null;
252
+ setTouchActionActive(false);
253
+ }
254
+ };
255
+ let timeoutId = null;
256
+ return initScrollHandlers({
257
+ axis: 'vertical',
258
+ wrapperRef: containerRef,
259
+ onTouchMove: handleScroll,
260
+ onTouchEnd: handleScrollEnd,
261
+ onWheelMove: (event) => {
262
+ handleScroll(event);
263
+ if (timeoutId !== null) {
264
+ clearTimeout(timeoutId);
208
265
  }
266
+ timeoutId = setTimeout(handleScrollEnd, 50);
209
267
  },
210
268
  });
211
- }, [columnRefs, columnWrapperRefs, cloneItemsBefore, cloneItemsAfter]);
212
- /**
213
- * Вычисляем layout-метрики
214
- */
215
- useEffect(() => {
216
- if (containerRef.current !== null) {
217
- stateRef.current.containerMetrics = containerRef.current.getBoundingClientRect();
218
- stateRef.current.scrollAreas = makeScrollAreas(stateRef.current.columns.length, stateRef.current.containerMetrics.width, showDelimiter);
269
+ }, [setTouchActionActive]);
270
+ const recalcLayoutMetrics = useCallback(() => {
271
+ if (!containerRef.current) {
272
+ return;
219
273
  }
220
- stateRef.current.columns.forEach((columnState, columnIndex) => {
221
- const columnWrapper = columnWrapperRefs.current?.[columnIndex];
222
- if (!columnWrapper) {
274
+ stateRef.current.containerMetrics = containerRef.current.getBoundingClientRect();
275
+ stateRef.current.scrollAreas = makeScrollAreas(stateRef.current.columns.length, stateRef.current.containerMetrics.width, showDelimiter);
276
+ const containerHeight = stateRef.current.containerMetrics.height;
277
+ stateRef.current.columns.forEach((columnState) => {
278
+ const { columnElement, columnWrapper } = columnState;
279
+ if (!columnElement || !columnWrapper) {
223
280
  return;
224
281
  }
225
282
  if (columnState.circular) {
226
- columnWrapper.style.maxHeight = `${columnWrapper.clientHeight}px`;
283
+ const cloneCount = Math.max(Math.ceil(containerHeight / (columnState.itemCount * ITEM_HEIGHT)), 1) * 2 + 1;
284
+ if (columnState.cloneCount !== cloneCount) {
285
+ columnState.cloneCount = cloneCount;
286
+ columnState.translateY -=
287
+ Math.floor(columnState.cloneCount / 2) * columnState.itemCount * ITEM_HEIGHT;
288
+ columnElement.style.transform = translateY(columnState.translateY);
289
+ setStateKey((stateKey) => stateKey + 1);
290
+ }
227
291
  }
292
+ columnState.visibleItemCount = Math.min(columnState.circular ? columnState.itemCount : columnState.itemCount * 2 - 1, floorToOdd(Math.floor(containerHeight / ITEM_HEIGHT)), fixedHeight ? FIXED_HEIGHT_ITEMS : Infinity);
293
+ const gradientStartPoint = (containerHeight - columnState.visibleItemCount * ITEM_HEIGHT) / 2;
294
+ const gradientEndPoint = containerHeight / 2 + (columnState.visibleItemCount * ITEM_HEIGHT) / 2;
295
+ columnWrapper.style.maskImage = `linear-gradient(
296
+ to bottom,
297
+ transparent ${gradientStartPoint}px,
298
+ #000 ${gradientStartPoint + 60}px,
299
+ #000 ${gradientEndPoint - 60}px,
300
+ transparent ${gradientEndPoint}px
301
+ )`;
228
302
  });
229
- }, [showDelimiter, columnWrapperRefs]);
230
- /**
231
- * Скроллим к initial значению либо округляем позицию скролла до ближайшего айтема после завершения анимации инерции скролла
232
- */
303
+ }, [fixedHeight, showDelimiter, setStateKey]);
304
+ useLayoutEffect(() => {
305
+ if (stateRef.current.containerMetrics !== null) {
306
+ recalcLayoutMetrics();
307
+ }
308
+ }, [recalcLayoutMetrics]);
309
+ useLayoutEffect(() => {
310
+ if (stateRef.current.containerMetrics === null) {
311
+ recalcLayoutMetrics();
312
+ }
313
+ });
314
+ // Скроллим к initial значению либо округляем позицию скролла до ближайшего айтема после завершения анимации инерции скролла
233
315
  useEffect(() => {
234
- selectedIndexes.forEach((selectedItemIndex, columnIndex) => {
235
- const columnState = stateRef.current.columns[columnIndex];
236
- const columnElement = columnRefs.current?.[columnIndex];
237
- const columnWrapper = columnWrapperRefs.current?.[columnIndex];
238
- if (!columnState || !columnElement || !columnWrapper) {
316
+ stateRef.current.columns.forEach((columnState, columnIndex) => {
317
+ const { columnElement, columnWrapper } = columnState;
318
+ if (!columnElement || !columnWrapper) {
239
319
  return;
240
320
  }
241
- // высота колонки либо клона
242
- const columnHeight = columnState.itemCount * ITEM_HEIGHT;
243
- // translateY, если бы текущий видимый клон был в дефолтной позиции (проскроллен до середины)
244
- const translateYAtDefaultPosition = Math.sign(columnState.translateY) *
245
- Math.floor(Math.abs(columnState.translateY) / columnHeight) *
246
- columnHeight;
247
- // translateY, когда колонка проскроллена в самый верх (выбран первый айтем)
248
- const minAllowedTranslateY = columnWrapper.clientHeight / 2 - ITEM_HEIGHT / 2;
249
321
  columnState.translateY =
250
- translateYAtDefaultPosition + (minAllowedTranslateY - selectedItemIndex * ITEM_HEIGHT);
322
+ -(Math.floor(columnState.cloneCount / 2) * columnState.itemCount * ITEM_HEIGHT) -
323
+ selectedIndexes[columnIndex] * ITEM_HEIGHT;
251
324
  columnElement.style.transform = translateY(columnState.translateY);
252
- if (columnState.circular) {
253
- cloneItemsBefore(columnState);
254
- cloneItemsAfter(columnState, columnElement, columnWrapper);
255
- }
256
- });
257
- }, [selectedIndexes, columnRefs, columnWrapperRefs, cloneItemsBefore, cloneItemsAfter]);
258
- /**
259
- * Если мы склонировали айтемы сверху для бесконечного скролла, корректируем translateY на высоту склонированных айтемов
260
- */
261
- useLayoutEffect(() => {
262
- stateRef.current.columns.forEach((columnState, columnIndex) => {
263
- const columnElement = columnRefs.current?.[columnIndex];
264
- if (!columnElement) {
265
- return;
266
- }
267
- if (columnState.translateYCorrection !== null) {
268
- columnState.translateY += columnState.translateYCorrection;
269
- columnState.translateYCorrection = null;
270
- columnElement.style.transform = translateY(columnState.translateY);
271
- }
325
+ columnState.itemElements.forEach((itemElement) => {
326
+ if (itemElement !== null) {
327
+ itemElement.style.transform = ``;
328
+ }
329
+ });
272
330
  });
273
- }, [stateKey, columnRefs]);
331
+ }, [selectedIndexes]);
274
332
  if (!visible) {
275
333
  return null;
276
334
  }
277
335
  const renderColumns = (startIndex, endIndex) => {
278
- return range(startIndex, endIndex).map((columnIndex) => (jsx("div", { className: classnames(styles.columnWrapper, {
279
- [styles.circularColumnWrapper]: columns[columnIndex].circular,
280
- [styles.wideColumnWrapper]: columns.length < 4 && columns.length > 1,
281
- [styles.fullWidthColumnWrapper]: columns.length === 1,
282
- }), ref: columnWrapperRefCallbacks[columnIndex], children: jsx("div", { className: styles.column, ref: columnRefCallbacks[columnIndex], children: stateRef.current?.columns[columnIndex] &&
283
- range(stateRef.current.columns[columnIndex].firstCloneIndex, stateRef.current.columns[columnIndex].lastCloneIndex + 1).flatMap((columnCloneIndex) => columns[columnIndex].items.map((item) => (jsx("div", { className: classnames(styles.item, {
284
- [styles.alignLeft]: columns[columnIndex].align === 'left',
285
- [styles.alignRight]: columns[columnIndex].align === 'right',
286
- [styles.disabled]: item.disabled,
287
- }), children: item.text }, `${columnCloneIndex}-${columns[columnIndex].items.length}-${item.key ?? item.text}`)))) }) }, `${columns.length}-${columnIndex}`)));
336
+ return range(startIndex, endIndex).map((columnIndex) => {
337
+ const columnState = stateRef.current.columns[columnIndex];
338
+ return (jsx("div", { className: classnames(styles.columnWrapper, {
339
+ [styles.wideColumnWrapper]: columns.length < 4 && columns.length > 1,
340
+ [styles.fullWidthColumnWrapper]: columns.length === 1,
341
+ }), ref: columnState.columnWrapperCallback, children: jsx("div", { className: styles.columnPositionWrapper, children: jsx("div", { className: styles.column, ref: columnState.columnElementCallback, children: [...Array(columnState.cloneCount).keys()].flatMap((columnCloneIndex) => columns[columnIndex].items.map((item, itemIndex) => (jsx("div", { className: classnames(styles.item, {
342
+ [styles.alignLeft]: columns[columnIndex].align === 'left',
343
+ [styles.alignRight]: columns[columnIndex].align === 'right',
344
+ [styles.disabled]: item.disabled,
345
+ [styles.selected]: itemIndex === selectedIndexes[columnIndex] &&
346
+ (!touchActionActive ||
347
+ columnIndex !== stateRef.current.activeColumnIndex),
348
+ }), ref: columnState.itemElementCallbacks?.get(columnCloneIndex * columnState.itemCount + itemIndex), children: item.text }, `${columnCloneIndex}-${columns[columnIndex].items.length}-${item.key ?? item.text}`)))) }) }) }, `${columns.length}-${columnIndex}`));
349
+ });
288
350
  };
289
- if (showDelimiter) {
290
- return (jsxs("div", { className: classnames(styles.pickerWheel), ref: containerRef, children: [jsx("div", { className: styles.selectedItemBackground }), jsxs("div", { className: classnames(styles.columns, { [styles.fixedHeight]: fixedHeight }), children: [renderColumns(0, columns.length / 2), jsx("div", { className: styles.columnWrapper, children: jsx("div", { className: styles.column, children: jsx("div", { className: styles.item, children: "\u2013" }) }) }), renderColumns(columns.length / 2, columns.length)] }), jsx("div", { className: styles.touchEventsOverlay })] }));
351
+ if (showDelimiter && columns.length % 2 === 0) {
352
+ return (jsxs("div", { className: classnames(styles.pickerWheel, { [styles.fixedHeight]: isFixedHeight }), ref: containerRef, children: [jsx("div", { className: styles.selectedItemBackground }), jsxs("div", { className: classnames(styles.columns), children: [renderColumns(0, columns.length / 2), jsx("div", { className: styles.columnWrapper, children: jsx("div", { className: styles.columnPositionWrapper, children: jsx("div", { className: styles.column, children: jsx("div", { className: classnames(styles.item, styles.selected), children: "\u2013" }) }) }) }), renderColumns(columns.length / 2, columns.length)] }), jsx("div", { className: styles.touchEventsOverlay })] }));
291
353
  }
292
- return (jsxs("div", { className: styles.pickerWheel, ref: containerRef, children: [jsx("div", { className: styles.selectedItemBackground }), jsx("div", { className: classnames(styles.columns, { [styles.fixedHeight]: fixedHeight }), children: renderColumns(0, columns.length) }), jsx("div", { className: styles.touchEventsOverlay })] }));
354
+ return (jsxs("div", { className: classnames(styles.pickerWheel, { [styles.fixedHeight]: isFixedHeight }), ref: containerRef, children: [jsx("div", { className: styles.selectedItemBackground }), jsx("div", { className: classnames(styles.columns), children: renderColumns(0, columns.length) }), jsx("div", { className: styles.touchEventsOverlay })] }));
293
355
  };
356
+ PickerWheel.isFullHeightBottomSheetContent = true;
294
357
 
295
358
  export { PickerWheel };
296
359
  //# sourceMappingURL=PickerWheel.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PickerWheel.js","sources":["../src/PickerWheel.tsx"],"sourcesContent":["import { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport classnames from 'classnames';\n\nimport { initScrollHandlers } from '@hh.ru/magritte-internal-custom-scroll';\nimport { useBreakpoint } from '@hh.ru/magritte-ui-breakpoint';\nimport { PickerWheelColumn, PickerWheelComponent } from '@hh.ru/magritte-ui-picker-wheel/types';\n\nimport styles from './picker-wheel.less';\n\nconst ITEM_HEIGHT = 48;\nconst COLUMN_WIDTH = 64;\nconst WIDE_COLUMN_WIDTH = 105;\n\n/**\n * Превращает массив точек в массив интервалов\n * [0, 50, 100, 200] => [{ left: 0, right: 50 }, { left: 50, right: 100 }, { left: 100, right: 200 }]\n */\nconst makeIntervalsFromPoints = (...points: Array<number>) => {\n return points\n .flatMap((point, index) => {\n if (index !== 0 && index !== points.length - 1) {\n return [point, point];\n }\n return point;\n })\n .reduce(\n (intervals, point, index) => {\n if (index % 2 === 0) {\n return [...intervals, { left: point }];\n }\n const interval = { ...intervals[intervals.length - 1], right: point };\n return [...intervals.slice(0, intervals.length - 1), interval];\n },\n [] as Array<{ left: number; right?: number }>\n ) as Array<{ left: number; right: number }>;\n};\n\n/**\n * Генерирует горизонтальные границы в пикселях относительно контейнера, в которых колонки должны реагировать на скролл\n */\nconst makeScrollAreas = (\n columnCount: number,\n containerWidth: number,\n showDelimiter?: boolean\n): Array<{ left: number; right: number }> => {\n switch (columnCount) {\n case 1:\n return makeIntervalsFromPoints(0, containerWidth);\n case 2:\n return makeIntervalsFromPoints(0, containerWidth / 2, containerWidth);\n case 3:\n return makeIntervalsFromPoints(\n 0,\n (containerWidth - WIDE_COLUMN_WIDTH) / 2,\n (containerWidth + WIDE_COLUMN_WIDTH) / 2,\n containerWidth\n );\n case 4:\n if (showDelimiter) {\n return makeIntervalsFromPoints(\n 0,\n containerWidth / 2 - COLUMN_WIDTH * 1.5,\n containerWidth / 2,\n containerWidth / 2 + COLUMN_WIDTH * 1.5,\n containerWidth\n );\n }\n return makeIntervalsFromPoints(\n 0,\n containerWidth / 2 - COLUMN_WIDTH,\n containerWidth / 2,\n containerWidth / 2 + COLUMN_WIDTH,\n containerWidth\n );\n default:\n throw new Error('Unexpected column count');\n }\n};\n\nconst range = (start: number, end: number) => {\n return [...Array(end - start).keys()].map((_, index) => index + start);\n};\n\nconst translateY = (value: number) => `translate3d(0, ${value}px, 0)`;\n\nconst useArrayOfRefs = <ElementType,>(\n length: number\n): [React.RefObject<Array<ElementType | null>>, Array<React.RefCallback<ElementType | null>>] => {\n const refs = useRef<Array<ElementType | null>>([]);\n const refCallbacks = useMemo(() => {\n return [...Array(length).keys()].map((index) => {\n return (element: ElementType | null) => {\n refs.current[index] = element;\n };\n });\n }, [length]);\n return [refs, refCallbacks];\n};\n\ninterface ColumnState {\n circular?: boolean;\n /**\n * Если колонка не зациклена (circular), всегда 0\n * Если колонка зациклена, это индекс самого первого клона колонки сверху для бесконечного скролла (начинается с -1 и уменьшается)\n */\n firstCloneIndex: number;\n /**\n * Если колонка не зациклена (circular), всегда 0\n * Если колонка зациклена, это индекс самого последнего клона колонки снизу для бесконечного скролла (начинается с 1 и увеличивается)\n */\n lastCloneIndex: number;\n /** Количество айтемов колонки, копируется из props.columns чтобы не нужно было добавлять props.columns в зависимости */\n itemCount: number;\n /** translateY для эмуляции скролла */\n translateY: number;\n /** Коррекция translateY, которую нужно применить в следующем layout эффекте, прежде чем отрендерятся новые айтемы сверху */\n translateYCorrection: number | null;\n}\n\ninterface PickerWheelState {\n activeColumnsIndex: number | null;\n animations: Array<{ renderedKey: number; itemIndex: number }>;\n containerMetrics: DOMRect | null;\n columns: Array<ColumnState>;\n scrollAreas: Array<{ left: number; right: number }> | null;\n}\n\nconst makeInitialState = (columns: Array<PickerWheelColumn>): PickerWheelState => {\n return {\n activeColumnsIndex: null,\n animations: [],\n containerMetrics: null,\n columns: columns.map((column) => ({\n circular: column.circular,\n firstCloneIndex: 0,\n lastCloneIndex: 0,\n itemCount: column.items.length,\n translateY: 0,\n translateYCorrection: null,\n })),\n scrollAreas: null,\n };\n};\n\nexport const PickerWheel: PickerWheelComponent = ({\n columns,\n fixedHeight,\n onChange,\n selectedIndexes,\n showDelimiter,\n}) => {\n const stateRef = useRef<PickerWheelState>(makeInitialState(columns));\n const [stateKey, setStateKey] = useState(0);\n\n const containerRef = useRef<HTMLDivElement>(null);\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n const selectedIndexesRef = useRef(selectedIndexes);\n selectedIndexesRef.current = selectedIndexes;\n const visible = useBreakpoint().isMobile;\n const [columnWrapperRefs, columnWrapperRefCallbacks] = useArrayOfRefs<HTMLDivElement>(columns.length);\n const [columnRefs, columnRefCallbacks] = useArrayOfRefs<HTMLDivElement>(columns.length);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container) {\n return void 0;\n }\n\n // вычисляем колонку, которую пользователь начал скроллить\n const handleTouchStart = (event: TouchEvent) => {\n event.preventDefault();\n event.stopPropagation();\n\n if (event.changedTouches.length === 1 && stateRef.current.containerMetrics !== null) {\n stateRef.current.activeColumnsIndex =\n stateRef.current.scrollAreas?.findIndex((interval) => {\n const relativeX =\n event.changedTouches[0].clientX - (stateRef.current.containerMetrics as DOMRect).left;\n return relativeX >= interval.left && relativeX <= interval.right;\n }) ?? null;\n }\n };\n\n // предотвращаем скролл боттомшита\n const handleTouchMove = (event: TouchEvent) => {\n event.preventDefault();\n event.stopPropagation();\n };\n\n container.addEventListener('touchstart', handleTouchStart, { passive: false });\n container.addEventListener('touchmove', handleTouchMove, { passive: false });\n return () => {\n container.removeEventListener('touchstart', handleTouchStart);\n container.removeEventListener('touchmove', handleTouchMove);\n };\n }, []);\n\n /**\n * Верхний край колонки близко к верхнему краю враппера — клонируем айтемы сверху\n * */\n const cloneItemsBefore = useCallback(\n (columnState: ColumnState) => {\n if (columnState.translateY > -100) {\n columnState.firstCloneIndex -= 1;\n columnState.translateYCorrection = -columnState.itemCount * ITEM_HEIGHT;\n setStateKey((stateKey) => stateKey + 1);\n }\n },\n [setStateKey]\n );\n\n /**\n * Нижний край колонки близко к нижнему краю враппера – клонируем айтемы снизу\n * */\n const cloneItemsAfter = useCallback(\n (columnState: ColumnState, columnElement: HTMLDivElement, columnWrapper: HTMLDivElement) => {\n if (columnElement.clientHeight + columnState.translateY - columnWrapper.clientHeight < 100) {\n columnState.lastCloneIndex += 1;\n setStateKey((stateKey) => stateKey + 1);\n }\n },\n [setStateKey]\n );\n\n useEffect(() => {\n return initScrollHandlers({\n axis: 'vertical',\n wrapperRef: containerRef,\n onTouchMove: (event) => {\n // TODO cache layout metrics\n if (stateRef.current.activeColumnsIndex !== null) {\n const columnIndex = stateRef.current.activeColumnsIndex;\n const columnState = stateRef.current?.columns[columnIndex];\n const columnElement = columnRefs.current?.[columnIndex];\n const columnWrapper = columnWrapperRefs.current?.[columnIndex];\n if (!columnState || !columnElement || !columnWrapper) {\n return;\n }\n\n columnState.translateY += event.delta;\n\n // бесконечный скролл — добавляем айтемы по мере необходимости\n if (columnState.circular) {\n // скролл вверх\n if (event.delta > 0) {\n cloneItemsBefore(columnState);\n }\n\n // скролл вниз\n if (event.delta < 0) {\n cloneItemsAfter(columnState, columnElement, columnWrapper);\n }\n }\n\n // скролл ограничен — делаем чтобы колонку было нельзя проскроллить за допустимые границы\n if (!columnState.circular) {\n // скролл вверх\n if (event.delta > 0) {\n // translateY, когда колонка проскроллена в самый верх (выбран первый айтем)\n const minAllowedTranslateY = columnWrapper.clientHeight / 2 - ITEM_HEIGHT / 2;\n columnState.translateY = Math.min(columnState.translateY, minAllowedTranslateY);\n }\n\n // скролл вниз\n if (event.delta < 0) {\n // translateY, когда колонка проскроллена в самый низ (выбран последний айтем)\n const maxAllowedTranslateY =\n columnWrapper.clientHeight / 2 - columnElement.clientHeight + ITEM_HEIGHT / 2;\n columnState.translateY = Math.max(columnState.translateY, maxAllowedTranslateY);\n }\n }\n\n columnElement.style.transform = translateY(columnState.translateY);\n }\n },\n onTouchEnd: () => {\n if (stateRef.current.activeColumnsIndex !== null) {\n const columnIndex = stateRef.current.activeColumnsIndex;\n const columnState = stateRef.current?.columns[columnIndex];\n const columnElement = columnRefs.current?.[columnIndex];\n const columnWrapper = columnWrapperRefs.current?.[columnIndex];\n if (!columnState || !columnElement || !columnWrapper) {\n return;\n }\n\n if (columnState.translateYCorrection !== null) {\n // TODO хз что делать\n }\n\n // TODO запретить останавливать скролл на disabled айтемах\n\n // translateY, когда колонка проскроллена в самый верх (выбран первый айтем)\n const minAllowedTranslateY = columnWrapper.clientHeight / 2 - ITEM_HEIGHT / 2;\n const _selectedItemIndex = Math.round(\n (minAllowedTranslateY - columnState.translateY) / ITEM_HEIGHT\n );\n // если колонка зациклена, у нее могут быть отрендерены клоны для бесконечного скролла\n // поэтому нужно взять остаток от деления на количество айтемов в колонке\n const selectedItemIndex = _selectedItemIndex % columnState.itemCount;\n\n const _selectedIndexes = [...selectedIndexesRef.current];\n _selectedIndexes[columnIndex] = selectedItemIndex;\n onChangeRef.current?.(_selectedIndexes as typeof selectedIndexes);\n\n stateRef.current.activeColumnsIndex = null;\n }\n },\n });\n }, [columnRefs, columnWrapperRefs, cloneItemsBefore, cloneItemsAfter]);\n\n /**\n * Вычисляем layout-метрики\n */\n useEffect(() => {\n if (containerRef.current !== null) {\n stateRef.current.containerMetrics = containerRef.current.getBoundingClientRect();\n stateRef.current.scrollAreas = makeScrollAreas(\n stateRef.current.columns.length,\n stateRef.current.containerMetrics.width,\n showDelimiter\n );\n }\n\n stateRef.current.columns.forEach((columnState, columnIndex) => {\n const columnWrapper = columnWrapperRefs.current?.[columnIndex];\n if (!columnWrapper) {\n return;\n }\n\n if (columnState.circular) {\n columnWrapper.style.maxHeight = `${columnWrapper.clientHeight}px`;\n }\n });\n }, [showDelimiter, columnWrapperRefs]);\n\n /**\n * Скроллим к initial значению либо округляем позицию скролла до ближайшего айтема после завершения анимации инерции скролла\n */\n useEffect(() => {\n selectedIndexes.forEach((selectedItemIndex, columnIndex) => {\n const columnState = stateRef.current.columns[columnIndex];\n const columnElement = columnRefs.current?.[columnIndex];\n const columnWrapper = columnWrapperRefs.current?.[columnIndex];\n if (!columnState || !columnElement || !columnWrapper) {\n return;\n }\n\n // высота колонки либо клона\n const columnHeight = columnState.itemCount * ITEM_HEIGHT;\n // translateY, если бы текущий видимый клон был в дефолтной позиции (проскроллен до середины)\n const translateYAtDefaultPosition =\n Math.sign(columnState.translateY) *\n Math.floor(Math.abs(columnState.translateY) / columnHeight) *\n columnHeight;\n // translateY, когда колонка проскроллена в самый верх (выбран первый айтем)\n const minAllowedTranslateY = columnWrapper.clientHeight / 2 - ITEM_HEIGHT / 2;\n columnState.translateY =\n translateYAtDefaultPosition + (minAllowedTranslateY - selectedItemIndex * ITEM_HEIGHT);\n columnElement.style.transform = translateY(columnState.translateY);\n\n if (columnState.circular) {\n cloneItemsBefore(columnState);\n cloneItemsAfter(columnState, columnElement, columnWrapper);\n }\n });\n }, [selectedIndexes, columnRefs, columnWrapperRefs, cloneItemsBefore, cloneItemsAfter]);\n\n /**\n * Если мы склонировали айтемы сверху для бесконечного скролла, корректируем translateY на высоту склонированных айтемов\n */\n useLayoutEffect(() => {\n stateRef.current.columns.forEach((columnState, columnIndex) => {\n const columnElement = columnRefs.current?.[columnIndex];\n if (!columnElement) {\n return;\n }\n\n if (columnState.translateYCorrection !== null) {\n columnState.translateY += columnState.translateYCorrection;\n columnState.translateYCorrection = null;\n columnElement.style.transform = translateY(columnState.translateY);\n }\n });\n }, [stateKey, columnRefs]);\n\n if (!visible) {\n return null;\n }\n\n const renderColumns = (startIndex: number, endIndex: number) => {\n return range(startIndex, endIndex).map((columnIndex) => (\n <div\n className={classnames(styles.columnWrapper, {\n [styles.circularColumnWrapper]: columns[columnIndex].circular,\n [styles.wideColumnWrapper]: columns.length < 4 && columns.length > 1,\n [styles.fullWidthColumnWrapper]: columns.length === 1,\n })}\n key={`${columns.length}-${columnIndex}`}\n ref={columnWrapperRefCallbacks[columnIndex]}\n >\n <div className={styles.column} ref={columnRefCallbacks[columnIndex]}>\n {/* Если колонка зациклена, у нее могут быть клоны сверху или снизу от оригинальной колонки для бесконечного скролла */}\n {/* У клона нет собственного DOM-элемента, это просто копия всех айтемов колонки */}\n {stateRef.current?.columns[columnIndex] &&\n range(\n stateRef.current.columns[columnIndex].firstCloneIndex,\n stateRef.current.columns[columnIndex].lastCloneIndex + 1\n ).flatMap((columnCloneIndex) =>\n columns[columnIndex].items.map((item) => (\n <div\n className={classnames(styles.item, {\n [styles.alignLeft]: columns[columnIndex].align === 'left',\n [styles.alignRight]: columns[columnIndex].align === 'right',\n [styles.disabled]: item.disabled,\n })}\n key={`${columnCloneIndex}-${columns[columnIndex].items.length}-${item.key ?? item.text}`}\n >\n {item.text}\n </div>\n ))\n )}\n </div>\n </div>\n ));\n };\n\n if (showDelimiter) {\n return (\n <div className={classnames(styles.pickerWheel)} ref={containerRef}>\n <div className={styles.selectedItemBackground} />\n <div className={classnames(styles.columns, { [styles.fixedHeight]: fixedHeight })}>\n {renderColumns(0, columns.length / 2)}\n <div className={styles.columnWrapper}>\n <div className={styles.column}>\n <div className={styles.item}>–</div>\n </div>\n </div>\n {renderColumns(columns.length / 2, columns.length)}\n </div>\n <div className={styles.touchEventsOverlay} />\n </div>\n );\n }\n\n return (\n <div className={styles.pickerWheel} ref={containerRef}>\n <div className={styles.selectedItemBackground} />\n <div className={classnames(styles.columns, { [styles.fixedHeight]: fixedHeight })}>\n {renderColumns(0, columns.length)}\n </div>\n <div className={styles.touchEventsOverlay} />\n </div>\n );\n};\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
1
+ {"version":3,"file":"PickerWheel.js","sources":["../src/PickerWheel.tsx"],"sourcesContent":["import { useCallback, useContext, useEffect, useLayoutEffect, useRef, useState } from 'react';\nimport classnames from 'classnames';\n\nimport { initScrollHandlers, ScrollGestureEvent } from '@hh.ru/magritte-internal-custom-scroll';\nimport { BottomSheetContext } from '@hh.ru/magritte-ui-bottom-sheet';\nimport { useBreakpoint } from '@hh.ru/magritte-ui-breakpoint';\nimport { PickerWheelColumn, PickerWheelComponent } from '@hh.ru/magritte-ui-picker-wheel/types';\n\nimport styles from './picker-wheel.less';\n\nconst FIXED_HEIGHT_ITEMS = 7;\nconst ITEM_HEIGHT = 48;\nconst COLUMN_WIDTH = 64;\nconst WIDE_COLUMN_WIDTH = 105;\nconst SELECTED_ITEM_SCALE = 22 / 18;\n\n/**\n * Превращает массив точек в массив интервалов\n * [0, 50, 100, 200] => [{ left: 0, right: 50 }, { left: 50, right: 100 }, { left: 100, right: 200 }]\n */\nconst makeIntervalsFromPoints = (...points: Array<number>) => {\n return points\n .flatMap((point, index) => {\n if (index !== 0 && index !== points.length - 1) {\n return [point, point];\n }\n return point;\n })\n .reduce(\n (intervals, point, index) => {\n if (index % 2 === 0) {\n return [...intervals, { left: point }];\n }\n const interval = { ...intervals[intervals.length - 1], right: point };\n return [...intervals.slice(0, intervals.length - 1), interval];\n },\n [] as Array<{ left: number; right?: number }>\n ) as Array<{ left: number; right: number }>;\n};\n\n/**\n * Генерирует горизонтальные границы в пикселях относительно контейнера, в которых колонки должны реагировать на скролл\n */\nconst makeScrollAreas = (\n columnCount: number,\n containerWidth: number,\n showDelimiter?: boolean\n): Array<{ left: number; right: number }> => {\n switch (columnCount) {\n case 1:\n return makeIntervalsFromPoints(0, containerWidth);\n case 2:\n return makeIntervalsFromPoints(0, containerWidth / 2, containerWidth);\n case 3:\n return makeIntervalsFromPoints(\n 0,\n (containerWidth - WIDE_COLUMN_WIDTH) / 2,\n (containerWidth + WIDE_COLUMN_WIDTH) / 2,\n containerWidth\n );\n case 4:\n if (showDelimiter) {\n return makeIntervalsFromPoints(\n 0,\n containerWidth / 2 - COLUMN_WIDTH * 1.5,\n containerWidth / 2,\n containerWidth / 2 + COLUMN_WIDTH * 1.5,\n containerWidth\n );\n }\n return makeIntervalsFromPoints(\n 0,\n containerWidth / 2 - COLUMN_WIDTH,\n containerWidth / 2,\n containerWidth / 2 + COLUMN_WIDTH,\n containerWidth\n );\n default:\n throw new Error('Unexpected column count');\n }\n};\n\nconst floorToOdd = (value: number) => (value % 2 !== 1 ? value - 1 : value);\n\nconst range = (start: number, end: number) => {\n return [...Array(end - start).keys()].map((_, index) => index + start);\n};\n\nconst translateY = (value: number) => `translate3d(0, ${value}px, 0)`;\n\ninterface ColumnState {\n circular?: boolean;\n /**\n * Если колонка не зациклена (circular), всегда 1\n * Если зациклена, то это количество копий колонки, которое нужно отрендерить, чтобы заполнить контейнер целиком\n */\n cloneCount: number;\n disabledItems: Set<number>;\n /** Количество айтемов колонки, копируется из props.columns чтобы не нужно было добавлять props.columns в зависимости */\n itemCount: number;\n /** translateY для эмуляции скролла */\n translateY: number;\n /** Количество видимых айтемов, всегда нечетное */\n visibleItemCount: number | null;\n columnElement: HTMLDivElement | null;\n columnElementCallback: React.RefCallback<HTMLDivElement | null>;\n columnWrapper: HTMLDivElement | null;\n columnWrapperCallback: React.RefCallback<HTMLDivElement | null>;\n itemElements: Map<number, HTMLDivElement | null>;\n itemElementCallbacks: Pick<Map<number, React.RefCallback<HTMLDivElement | null>>, 'get'>;\n}\n\ninterface PickerWheelState {\n activeColumnIndex: number | null;\n animations: Array<{ renderedKey: number; itemIndex: number }>;\n containerMetrics: DOMRect | null;\n columns: Array<ColumnState>;\n scrollAreas: Array<{ left: number; right: number }> | null;\n scrollDirection: 'up' | 'down' | null;\n}\n\nconst makeInitialState = (columns: Array<PickerWheelColumn>): PickerWheelState => {\n return {\n activeColumnIndex: null,\n animations: [],\n containerMetrics: null,\n columns: columns.map((column) => {\n const itemElementCallbacks: Map<number, React.RefCallback<HTMLDivElement | null>> = new Map();\n const columnState: ColumnState = {\n circular: column.circular,\n cloneCount: 1,\n disabledItems: new Set(),\n itemCount: column.items.length,\n translateY: 0,\n visibleItemCount: null,\n columnElement: null,\n columnElementCallback: (element) => (columnState.columnElement = element),\n columnWrapper: null,\n columnWrapperCallback: (element) => (columnState.columnWrapper = element),\n itemElements: new Map(),\n itemElementCallbacks: {\n get: (itemIndex: number) => {\n if (!itemElementCallbacks.has(itemIndex)) {\n itemElementCallbacks.set(itemIndex, (element) => {\n columnState.itemElements.set(itemIndex, element);\n });\n }\n return itemElementCallbacks.get(itemIndex);\n },\n },\n };\n return columnState;\n }),\n scrollAreas: null,\n scrollDirection: null,\n };\n};\n\nexport const PickerWheel: PickerWheelComponent = ({\n columns,\n fixedHeight,\n onChange,\n selectedIndexes,\n showDelimiter,\n}) => {\n if (columns.length !== selectedIndexes.length) {\n throw new Error('selectedIndexes.length does not match columns.length');\n }\n\n const stateRef = useRef<PickerWheelState>(makeInitialState(columns));\n if (\n columns.length !== stateRef.current.columns.length ||\n columns.some((column, columnIndex) => {\n return (\n column.items.length !== stateRef.current.columns[columnIndex].itemCount ||\n column.circular !== stateRef.current.columns[columnIndex].circular\n );\n })\n ) {\n stateRef.current = makeInitialState(columns);\n }\n columns.forEach(\n (column, columnIndex) =>\n (stateRef.current.columns[columnIndex].disabledItems = new Set(\n column.items.reduce(\n (result, item, itemIndex) => (item.disabled ? [...result, itemIndex] : result),\n [] as Array<number>\n )\n ))\n );\n\n const bottomSheetContext = useContext(BottomSheetContext);\n const containerRef = useRef<HTMLDivElement>(null);\n const isFixedHeight = bottomSheetContext.height !== 'full-screen' || fixedHeight;\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n const selectedIndexesRef = useRef(selectedIndexes);\n selectedIndexesRef.current = selectedIndexes;\n const [_, setStateKey] = useState(0);\n const [touchActionActive, setTouchActionActive] = useState(false);\n const visible = useBreakpoint().isMobile;\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container) {\n return void 0;\n }\n\n // вычисляем колонку, которую пользователь начал скроллить\n const setActiveColumn = (clientX: number) => {\n const containerMetrics = stateRef.current.containerMetrics;\n if (containerMetrics !== null) {\n stateRef.current.activeColumnIndex =\n stateRef.current.scrollAreas?.findIndex((interval) => {\n const relativeX = clientX - containerMetrics.left;\n return relativeX >= interval.left && relativeX <= interval.right;\n }) ?? null;\n }\n };\n\n const handleTouchStart = (event: TouchEvent) => {\n event.preventDefault();\n event.stopPropagation();\n\n event.changedTouches.length === 1 && setActiveColumn(event.changedTouches[0].clientX);\n };\n\n const handleTouchMove = (event: TouchEvent) => {\n event.preventDefault();\n event.stopPropagation();\n };\n\n const handleWheel = (event: WheelEvent) => {\n event.preventDefault();\n event.stopPropagation();\n\n setActiveColumn(event.clientX);\n };\n\n container.addEventListener('touchstart', handleTouchStart, { passive: false });\n container.addEventListener('touchmove', handleTouchMove, { passive: false });\n container.addEventListener('wheel', handleWheel, { passive: false });\n return () => {\n container.removeEventListener('touchstart', handleTouchStart);\n container.removeEventListener('touchmove', handleTouchMove);\n container.removeEventListener('wheel', handleWheel);\n };\n }, []);\n\n useEffect(() => {\n const handleScroll = (event: ScrollGestureEvent) => {\n if (stateRef.current.activeColumnIndex !== null && stateRef.current.containerMetrics !== null) {\n const columnIndex = stateRef.current.activeColumnIndex;\n const columnState = stateRef.current?.columns[columnIndex];\n const { columnElement, columnWrapper } = columnState;\n if (!columnState || !columnState.visibleItemCount || !columnElement || !columnWrapper) {\n return;\n }\n\n stateRef.current.scrollDirection = event.delta > 0 ? 'up' : 'down';\n columnState.translateY += event.delta;\n\n // бесконечный скролл\n if (columnState.circular) {\n // скролл вверх\n // верхний край колонки близко к верхнему краю враппера\n if (\n event.delta > 0 &&\n stateRef.current.containerMetrics.height / 2 + columnState.translateY > -100\n ) {\n columnState.translateY -= columnState.itemCount * ITEM_HEIGHT;\n }\n\n // скролл вниз\n // нижний край колонки близко к нижнему краю враппера\n if (\n event.delta < 0 &&\n columnState.cloneCount * columnState.itemCount * ITEM_HEIGHT +\n columnState.translateY -\n stateRef.current.containerMetrics.height / 2 <\n 100\n ) {\n columnState.translateY += columnState.itemCount * ITEM_HEIGHT;\n }\n }\n\n // скролл ограничен — делаем чтобы колонку было нельзя проскроллить за допустимые границы\n if (!columnState.circular) {\n // скролл вверх\n if (event.delta > 0) {\n // translateY, когда колонка проскроллена в самый верх (выбран первый айтем)\n const minAllowedTranslateY = 0;\n columnState.translateY = Math.min(columnState.translateY, minAllowedTranslateY);\n }\n\n // скролл вниз\n if (event.delta < 0) {\n // translateY, когда колонка проскроллена в самый низ (выбран последний айтем)\n const maxAllowedTranslateY = (columnState.itemCount - 1) * ITEM_HEIGHT;\n columnState.translateY = Math.max(columnState.translateY, -maxAllowedTranslateY);\n }\n }\n\n // анимация увеличения ближайшего к центру айтема\n const selectedItemIndex = Math.round(-columnState.translateY / ITEM_HEIGHT);\n if (columnState.itemElements.has(selectedItemIndex)) {\n const halfItemHeight = ITEM_HEIGHT / 2;\n (columnState.itemElements.get(selectedItemIndex) as HTMLElement).style.transform =\n `scale(${1 + (SELECTED_ITEM_SCALE - 1) * Math.abs((Math.abs(columnState.translateY % ITEM_HEIGHT) - halfItemHeight) / halfItemHeight)})`;\n }\n\n columnElement.style.transform = translateY(columnState.translateY);\n setTouchActionActive(true);\n }\n };\n\n const handleScrollEnd = () => {\n if (stateRef.current.activeColumnIndex !== null) {\n const columnIndex = stateRef.current.activeColumnIndex;\n const columnState = stateRef.current?.columns[columnIndex];\n const { columnElement, columnWrapper } = columnState;\n if (!columnState || !columnElement || !columnWrapper) {\n return;\n }\n\n // если колонка зациклена, у нее могут быть отрендерены клоны для бесконечного скролла\n // поэтому нужно взять остаток от деления на количество айтемов в колонке\n const _selectedItemIndex =\n Math.round(Math.abs(columnState.translateY) / ITEM_HEIGHT) % columnState.itemCount;\n let selectedItemIndex = _selectedItemIndex;\n // если выбранный айтем disabled, ищем ближайший не disabled в направлении скролла\n if (columnState.disabledItems.has(selectedItemIndex)) {\n do {\n if (stateRef.current.scrollDirection === 'up') {\n selectedItemIndex -= 1;\n if (selectedItemIndex < 0) {\n selectedItemIndex = columnState.itemCount - 1;\n }\n } else if (stateRef.current.scrollDirection === 'down') {\n selectedItemIndex += 1;\n if (selectedItemIndex > columnState.itemCount - 1) {\n selectedItemIndex = 0;\n }\n } else {\n break;\n }\n } while (\n columnState.disabledItems.has(selectedItemIndex) &&\n selectedItemIndex !== _selectedItemIndex\n );\n }\n\n const _selectedIndexes = [...selectedIndexesRef.current];\n _selectedIndexes[columnIndex] = selectedItemIndex;\n onChangeRef.current?.(_selectedIndexes);\n\n stateRef.current.activeColumnIndex = null;\n stateRef.current.scrollDirection = null;\n setTouchActionActive(false);\n }\n };\n\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n return initScrollHandlers({\n axis: 'vertical',\n wrapperRef: containerRef,\n onTouchMove: handleScroll,\n onTouchEnd: handleScrollEnd,\n onWheelMove: (event) => {\n handleScroll(event);\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n }\n timeoutId = setTimeout(handleScrollEnd, 50);\n },\n });\n }, [setTouchActionActive]);\n\n const recalcLayoutMetrics = useCallback(() => {\n if (!containerRef.current) {\n return;\n }\n\n stateRef.current.containerMetrics = containerRef.current.getBoundingClientRect();\n stateRef.current.scrollAreas = makeScrollAreas(\n stateRef.current.columns.length,\n stateRef.current.containerMetrics.width,\n showDelimiter\n );\n\n const containerHeight = stateRef.current.containerMetrics.height;\n stateRef.current.columns.forEach((columnState) => {\n const { columnElement, columnWrapper } = columnState;\n if (!columnElement || !columnWrapper) {\n return;\n }\n\n if (columnState.circular) {\n const cloneCount =\n Math.max(Math.ceil(containerHeight / (columnState.itemCount * ITEM_HEIGHT)), 1) * 2 + 1;\n if (columnState.cloneCount !== cloneCount) {\n columnState.cloneCount = cloneCount;\n columnState.translateY -=\n Math.floor(columnState.cloneCount / 2) * columnState.itemCount * ITEM_HEIGHT;\n columnElement.style.transform = translateY(columnState.translateY);\n setStateKey((stateKey) => stateKey + 1);\n }\n }\n\n columnState.visibleItemCount = Math.min(\n columnState.circular ? columnState.itemCount : columnState.itemCount * 2 - 1,\n floorToOdd(Math.floor(containerHeight / ITEM_HEIGHT)),\n fixedHeight ? FIXED_HEIGHT_ITEMS : Infinity\n );\n const gradientStartPoint = (containerHeight - columnState.visibleItemCount * ITEM_HEIGHT) / 2;\n const gradientEndPoint = containerHeight / 2 + (columnState.visibleItemCount * ITEM_HEIGHT) / 2;\n columnWrapper.style.maskImage = `linear-gradient(\n to bottom,\n transparent ${gradientStartPoint}px,\n #000 ${gradientStartPoint + 60}px,\n #000 ${gradientEndPoint - 60}px,\n transparent ${gradientEndPoint}px\n )`;\n });\n }, [fixedHeight, showDelimiter, setStateKey]);\n\n useLayoutEffect(() => {\n if (stateRef.current.containerMetrics !== null) {\n recalcLayoutMetrics();\n }\n }, [recalcLayoutMetrics]);\n\n useLayoutEffect(() => {\n if (stateRef.current.containerMetrics === null) {\n recalcLayoutMetrics();\n }\n });\n\n // Скроллим к initial значению либо округляем позицию скролла до ближайшего айтема после завершения анимации инерции скролла\n useEffect(() => {\n stateRef.current.columns.forEach((columnState, columnIndex) => {\n const { columnElement, columnWrapper } = columnState;\n if (!columnElement || !columnWrapper) {\n return;\n }\n\n columnState.translateY =\n -(Math.floor(columnState.cloneCount / 2) * columnState.itemCount * ITEM_HEIGHT) -\n selectedIndexes[columnIndex] * ITEM_HEIGHT;\n columnElement.style.transform = translateY(columnState.translateY);\n\n columnState.itemElements.forEach((itemElement) => {\n if (itemElement !== null) {\n itemElement.style.transform = ``;\n }\n });\n });\n }, [selectedIndexes]);\n\n if (!visible) {\n return null;\n }\n\n const renderColumns = (startIndex: number, endIndex: number) => {\n return range(startIndex, endIndex).map((columnIndex) => {\n const columnState = stateRef.current.columns[columnIndex];\n return (\n <div\n className={classnames(styles.columnWrapper, {\n [styles.wideColumnWrapper]: columns.length < 4 && columns.length > 1,\n [styles.fullWidthColumnWrapper]: columns.length === 1,\n })}\n key={`${columns.length}-${columnIndex}`}\n ref={columnState.columnWrapperCallback}\n >\n <div className={styles.columnPositionWrapper}>\n <div className={styles.column} ref={columnState.columnElementCallback}>\n {[...Array(columnState.cloneCount).keys()].flatMap((columnCloneIndex) =>\n columns[columnIndex].items.map((item, itemIndex) => (\n <div\n className={classnames(styles.item, {\n [styles.alignLeft]: columns[columnIndex].align === 'left',\n [styles.alignRight]: columns[columnIndex].align === 'right',\n [styles.disabled]: item.disabled,\n [styles.selected]:\n itemIndex === selectedIndexes[columnIndex] &&\n (!touchActionActive ||\n columnIndex !== stateRef.current.activeColumnIndex),\n })}\n key={`${columnCloneIndex}-${columns[columnIndex].items.length}-${item.key ?? item.text}`}\n ref={columnState.itemElementCallbacks?.get(\n columnCloneIndex * columnState.itemCount + itemIndex\n )}\n >\n {item.text}\n </div>\n ))\n )}\n </div>\n </div>\n </div>\n );\n });\n };\n\n if (showDelimiter && columns.length % 2 === 0) {\n return (\n <div className={classnames(styles.pickerWheel, { [styles.fixedHeight]: isFixedHeight })} ref={containerRef}>\n <div className={styles.selectedItemBackground} />\n <div className={classnames(styles.columns)}>\n {renderColumns(0, columns.length / 2)}\n <div className={styles.columnWrapper}>\n <div className={styles.columnPositionWrapper}>\n <div className={styles.column}>\n <div className={classnames(styles.item, styles.selected)}>–</div>\n </div>\n </div>\n </div>\n {renderColumns(columns.length / 2, columns.length)}\n </div>\n <div className={styles.touchEventsOverlay} />\n </div>\n );\n }\n\n return (\n <div className={classnames(styles.pickerWheel, { [styles.fixedHeight]: isFixedHeight })} ref={containerRef}>\n <div className={styles.selectedItemBackground} />\n <div className={classnames(styles.columns)}>{renderColumns(0, columns.length)}</div>\n <div className={styles.touchEventsOverlay} />\n </div>\n );\n};\n\nPickerWheel.isFullHeightBottomSheetContent = true;\n"],"names":["_jsx","_jsxs"],"mappings":";;;;;;;;;AAUA,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAC7B,MAAM,WAAW,GAAG,EAAE,CAAC;AACvB,MAAM,YAAY,GAAG,EAAE,CAAC;AACxB,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAC9B,MAAM,mBAAmB,GAAG,EAAE,GAAG,EAAE,CAAC;AAEpC;;;AAGG;AACH,MAAM,uBAAuB,GAAG,CAAC,GAAG,MAAqB,KAAI;AACzD,IAAA,OAAO,MAAM;AACR,SAAA,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,KAAI;AACtB,QAAA,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;AAC5C,YAAA,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;SACzB;AACD,QAAA,OAAO,KAAK,CAAC;AACjB,KAAC,CAAC;SACD,MAAM,CACH,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,KAAI;AACxB,QAAA,IAAI,KAAK,GAAG,CAAC,KAAK,CAAC,EAAE;YACjB,OAAO,CAAC,GAAG,SAAS,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;SAC1C;AACD,QAAA,MAAM,QAAQ,GAAG,EAAE,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AACtE,QAAA,OAAO,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;KAClE,EACD,EAA6C,CACN,CAAC;AACpD,CAAC,CAAC;AAEF;;AAEG;AACH,MAAM,eAAe,GAAG,CACpB,WAAmB,EACnB,cAAsB,EACtB,aAAuB,KACiB;IACxC,QAAQ,WAAW;AACf,QAAA,KAAK,CAAC;AACF,YAAA,OAAO,uBAAuB,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;AACtD,QAAA,KAAK,CAAC;YACF,OAAO,uBAAuB,CAAC,CAAC,EAAE,cAAc,GAAG,CAAC,EAAE,cAAc,CAAC,CAAC;AAC1E,QAAA,KAAK,CAAC;YACF,OAAO,uBAAuB,CAC1B,CAAC,EACD,CAAC,cAAc,GAAG,iBAAiB,IAAI,CAAC,EACxC,CAAC,cAAc,GAAG,iBAAiB,IAAI,CAAC,EACxC,cAAc,CACjB,CAAC;AACN,QAAA,KAAK,CAAC;YACF,IAAI,aAAa,EAAE;gBACf,OAAO,uBAAuB,CAC1B,CAAC,EACD,cAAc,GAAG,CAAC,GAAG,YAAY,GAAG,GAAG,EACvC,cAAc,GAAG,CAAC,EAClB,cAAc,GAAG,CAAC,GAAG,YAAY,GAAG,GAAG,EACvC,cAAc,CACjB,CAAC;aACL;YACD,OAAO,uBAAuB,CAC1B,CAAC,EACD,cAAc,GAAG,CAAC,GAAG,YAAY,EACjC,cAAc,GAAG,CAAC,EAClB,cAAc,GAAG,CAAC,GAAG,YAAY,EACjC,cAAc,CACjB,CAAC;AACN,QAAA;AACI,YAAA,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;KAClD;AACL,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,KAAa,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;AAE5E,MAAM,KAAK,GAAG,CAAC,KAAa,EAAE,GAAW,KAAI;IACzC,OAAO,CAAC,GAAG,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,KAAK,GAAG,KAAK,CAAC,CAAC;AAC3E,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,KAAa,KAAK,CAAA,eAAA,EAAkB,KAAK,CAAA,MAAA,CAAQ,CAAC;AAiCtE,MAAM,gBAAgB,GAAG,CAAC,OAAiC,KAAsB;IAC7E,OAAO;AACH,QAAA,iBAAiB,EAAE,IAAI;AACvB,QAAA,UAAU,EAAE,EAAE;AACd,QAAA,gBAAgB,EAAE,IAAI;QACtB,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,KAAI;AAC5B,YAAA,MAAM,oBAAoB,GAA0D,IAAI,GAAG,EAAE,CAAC;AAC9F,YAAA,MAAM,WAAW,GAAgB;gBAC7B,QAAQ,EAAE,MAAM,CAAC,QAAQ;AACzB,gBAAA,UAAU,EAAE,CAAC;gBACb,aAAa,EAAE,IAAI,GAAG,EAAE;AACxB,gBAAA,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM;AAC9B,gBAAA,UAAU,EAAE,CAAC;AACb,gBAAA,gBAAgB,EAAE,IAAI;AACtB,gBAAA,aAAa,EAAE,IAAI;AACnB,gBAAA,qBAAqB,EAAE,CAAC,OAAO,MAAM,WAAW,CAAC,aAAa,GAAG,OAAO,CAAC;AACzE,gBAAA,aAAa,EAAE,IAAI;AACnB,gBAAA,qBAAqB,EAAE,CAAC,OAAO,MAAM,WAAW,CAAC,aAAa,GAAG,OAAO,CAAC;gBACzE,YAAY,EAAE,IAAI,GAAG,EAAE;AACvB,gBAAA,oBAAoB,EAAE;AAClB,oBAAA,GAAG,EAAE,CAAC,SAAiB,KAAI;wBACvB,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE;4BACtC,oBAAoB,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,OAAO,KAAI;gCAC5C,WAAW,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;AACrD,6BAAC,CAAC,CAAC;yBACN;AACD,wBAAA,OAAO,oBAAoB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;qBAC9C;AACJ,iBAAA;aACJ,CAAC;AACF,YAAA,OAAO,WAAW,CAAC;AACvB,SAAC,CAAC;AACF,QAAA,WAAW,EAAE,IAAI;AACjB,QAAA,eAAe,EAAE,IAAI;KACxB,CAAC;AACN,CAAC,CAAC;AAEW,MAAA,WAAW,GAAyB,CAAC,EAC9C,OAAO,EACP,WAAW,EACX,QAAQ,EACR,eAAe,EACf,aAAa,GAChB,KAAI;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,eAAe,CAAC,MAAM,EAAE;AAC3C,QAAA,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;KAC3E;IAED,MAAM,QAAQ,GAAG,MAAM,CAAmB,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC;IACrE,IACI,OAAO,CAAC,MAAM,KAAK,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM;QAClD,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,WAAW,KAAI;AACjC,YAAA,QACI,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,SAAS;AACvE,gBAAA,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,QAAQ,EACpE;SACL,CAAC,EACJ;AACE,QAAA,QAAQ,CAAC,OAAO,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;KAChD;AACD,IAAA,OAAO,CAAC,OAAO,CACX,CAAC,MAAM,EAAE,WAAW,MACf,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,aAAa,GAAG,IAAI,GAAG,CAC1D,MAAM,CAAC,KAAK,CAAC,MAAM,CACf,CAAC,MAAM,EAAE,IAAI,EAAE,SAAS,MAAM,IAAI,CAAC,QAAQ,GAAG,CAAC,GAAG,MAAM,EAAE,SAAS,CAAC,GAAG,MAAM,CAAC,EAC9E,EAAmB,CACtB,CACJ,CAAC,CACT,CAAC;AAEF,IAAA,MAAM,kBAAkB,GAAG,UAAU,CAAC,kBAAkB,CAAC,CAAC;AAC1D,IAAA,MAAM,YAAY,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAClD,MAAM,aAAa,GAAG,kBAAkB,CAAC,MAAM,KAAK,aAAa,IAAI,WAAW,CAAC;AACjF,IAAA,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;AACrC,IAAA,WAAW,CAAC,OAAO,GAAG,QAAQ,CAAC;AAC/B,IAAA,MAAM,kBAAkB,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC;AACnD,IAAA,kBAAkB,CAAC,OAAO,GAAG,eAAe,CAAC;IAC7C,MAAM,CAAC,CAAC,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IACrC,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;AAClE,IAAA,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC,QAAQ,CAAC;IAEzC,SAAS,CAAC,MAAK;AACX,QAAA,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC;QACvC,IAAI,CAAC,SAAS,EAAE;YACZ,OAAO,KAAK,CAAC,CAAC;SACjB;;AAGD,QAAA,MAAM,eAAe,GAAG,CAAC,OAAe,KAAI;AACxC,YAAA,MAAM,gBAAgB,GAAG,QAAQ,CAAC,OAAO,CAAC,gBAAgB,CAAC;AAC3D,YAAA,IAAI,gBAAgB,KAAK,IAAI,EAAE;gBAC3B,QAAQ,CAAC,OAAO,CAAC,iBAAiB;oBAC9B,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC,QAAQ,KAAI;AACjD,wBAAA,MAAM,SAAS,GAAG,OAAO,GAAG,gBAAgB,CAAC,IAAI,CAAC;wBAClD,OAAO,SAAS,IAAI,QAAQ,CAAC,IAAI,IAAI,SAAS,IAAI,QAAQ,CAAC,KAAK,CAAC;qBACpE,CAAC,IAAI,IAAI,CAAC;aAClB;AACL,SAAC,CAAC;AAEF,QAAA,MAAM,gBAAgB,GAAG,CAAC,KAAiB,KAAI;YAC3C,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,KAAK,CAAC,eAAe,EAAE,CAAC;AAExB,YAAA,KAAK,CAAC,cAAc,CAAC,MAAM,KAAK,CAAC,IAAI,eAAe,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;AAC1F,SAAC,CAAC;AAEF,QAAA,MAAM,eAAe,GAAG,CAAC,KAAiB,KAAI;YAC1C,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,KAAK,CAAC,eAAe,EAAE,CAAC;AAC5B,SAAC,CAAC;AAEF,QAAA,MAAM,WAAW,GAAG,CAAC,KAAiB,KAAI;YACtC,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,KAAK,CAAC,eAAe,EAAE,CAAC;AAExB,YAAA,eAAe,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AACnC,SAAC,CAAC;AAEF,QAAA,SAAS,CAAC,gBAAgB,CAAC,YAAY,EAAE,gBAAgB,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;AAC/E,QAAA,SAAS,CAAC,gBAAgB,CAAC,WAAW,EAAE,eAAe,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;AAC7E,QAAA,SAAS,CAAC,gBAAgB,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;AACrE,QAAA,OAAO,MAAK;AACR,YAAA,SAAS,CAAC,mBAAmB,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC;AAC9D,YAAA,SAAS,CAAC,mBAAmB,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;AAC5D,YAAA,SAAS,CAAC,mBAAmB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;AACxD,SAAC,CAAC;KACL,EAAE,EAAE,CAAC,CAAC;IAEP,SAAS,CAAC,MAAK;AACX,QAAA,MAAM,YAAY,GAAG,CAAC,KAAyB,KAAI;AAC/C,YAAA,IAAI,QAAQ,CAAC,OAAO,CAAC,iBAAiB,KAAK,IAAI,IAAI,QAAQ,CAAC,OAAO,CAAC,gBAAgB,KAAK,IAAI,EAAE;AAC3F,gBAAA,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,iBAAiB,CAAC;gBACvD,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;AAC3D,gBAAA,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,GAAG,WAAW,CAAC;AACrD,gBAAA,IAAI,CAAC,WAAW,IAAI,CAAC,WAAW,CAAC,gBAAgB,IAAI,CAAC,aAAa,IAAI,CAAC,aAAa,EAAE;oBACnF,OAAO;iBACV;AAED,gBAAA,QAAQ,CAAC,OAAO,CAAC,eAAe,GAAG,KAAK,CAAC,KAAK,GAAG,CAAC,GAAG,IAAI,GAAG,MAAM,CAAC;AACnE,gBAAA,WAAW,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,CAAC;;AAGtC,gBAAA,IAAI,WAAW,CAAC,QAAQ,EAAE;;;AAGtB,oBAAA,IACI,KAAK,CAAC,KAAK,GAAG,CAAC;AACf,wBAAA,QAAQ,CAAC,OAAO,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,GAAG,WAAW,CAAC,UAAU,GAAG,CAAC,GAAG,EAC9E;wBACE,WAAW,CAAC,UAAU,IAAI,WAAW,CAAC,SAAS,GAAG,WAAW,CAAC;qBACjE;;;AAID,oBAAA,IACI,KAAK,CAAC,KAAK,GAAG,CAAC;AACf,wBAAA,WAAW,CAAC,UAAU,GAAG,WAAW,CAAC,SAAS,GAAG,WAAW;AACxD,4BAAA,WAAW,CAAC,UAAU;AACtB,4BAAA,QAAQ,CAAC,OAAO,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC;AAC5C,4BAAA,GAAG,EACT;wBACE,WAAW,CAAC,UAAU,IAAI,WAAW,CAAC,SAAS,GAAG,WAAW,CAAC;qBACjE;iBACJ;;AAGD,gBAAA,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE;;AAEvB,oBAAA,IAAI,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE;;wBAEjB,MAAM,oBAAoB,GAAG,CAAC,CAAC;AAC/B,wBAAA,WAAW,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,UAAU,EAAE,oBAAoB,CAAC,CAAC;qBACnF;;AAGD,oBAAA,IAAI,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE;;wBAEjB,MAAM,oBAAoB,GAAG,CAAC,WAAW,CAAC,SAAS,GAAG,CAAC,IAAI,WAAW,CAAC;AACvE,wBAAA,WAAW,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,UAAU,EAAE,CAAC,oBAAoB,CAAC,CAAC;qBACpF;iBACJ;;AAGD,gBAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,UAAU,GAAG,WAAW,CAAC,CAAC;gBAC5E,IAAI,WAAW,CAAC,YAAY,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE;AACjD,oBAAA,MAAM,cAAc,GAAG,WAAW,GAAG,CAAC,CAAC;oBACtC,WAAW,CAAC,YAAY,CAAC,GAAG,CAAC,iBAAiB,CAAiB,CAAC,KAAK,CAAC,SAAS;AAC5E,wBAAA,CAAA,MAAA,EAAS,CAAC,GAAG,CAAC,mBAAmB,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,UAAU,GAAG,WAAW,CAAC,GAAG,cAAc,IAAI,cAAc,CAAC,GAAG,CAAC;iBAChJ;gBAED,aAAa,CAAC,KAAK,CAAC,SAAS,GAAG,UAAU,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;gBACnE,oBAAoB,CAAC,IAAI,CAAC,CAAC;aAC9B;AACL,SAAC,CAAC;QAEF,MAAM,eAAe,GAAG,MAAK;YACzB,IAAI,QAAQ,CAAC,OAAO,CAAC,iBAAiB,KAAK,IAAI,EAAE;AAC7C,gBAAA,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,iBAAiB,CAAC;gBACvD,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;AAC3D,gBAAA,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,GAAG,WAAW,CAAC;gBACrD,IAAI,CAAC,WAAW,IAAI,CAAC,aAAa,IAAI,CAAC,aAAa,EAAE;oBAClD,OAAO;iBACV;;;gBAID,MAAM,kBAAkB,GACpB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,UAAU,CAAC,GAAG,WAAW,CAAC,GAAG,WAAW,CAAC,SAAS,CAAC;gBACvF,IAAI,iBAAiB,GAAG,kBAAkB,CAAC;;gBAE3C,IAAI,WAAW,CAAC,aAAa,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE;AAClD,oBAAA,GAAG;wBACC,IAAI,QAAQ,CAAC,OAAO,CAAC,eAAe,KAAK,IAAI,EAAE;4BAC3C,iBAAiB,IAAI,CAAC,CAAC;AACvB,4BAAA,IAAI,iBAAiB,GAAG,CAAC,EAAE;AACvB,gCAAA,iBAAiB,GAAG,WAAW,CAAC,SAAS,GAAG,CAAC,CAAC;6BACjD;yBACJ;6BAAM,IAAI,QAAQ,CAAC,OAAO,CAAC,eAAe,KAAK,MAAM,EAAE;4BACpD,iBAAiB,IAAI,CAAC,CAAC;4BACvB,IAAI,iBAAiB,GAAG,WAAW,CAAC,SAAS,GAAG,CAAC,EAAE;gCAC/C,iBAAiB,GAAG,CAAC,CAAC;6BACzB;yBACJ;6BAAM;4BACH,MAAM;yBACT;qBACJ,QACG,WAAW,CAAC,aAAa,CAAC,GAAG,CAAC,iBAAiB,CAAC;wBAChD,iBAAiB,KAAK,kBAAkB,EAC1C;iBACL;gBAED,MAAM,gBAAgB,GAAG,CAAC,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;AACzD,gBAAA,gBAAgB,CAAC,WAAW,CAAC,GAAG,iBAAiB,CAAC;AAClD,gBAAA,WAAW,CAAC,OAAO,GAAG,gBAAgB,CAAC,CAAC;AAExC,gBAAA,QAAQ,CAAC,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;AAC1C,gBAAA,QAAQ,CAAC,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;gBACxC,oBAAoB,CAAC,KAAK,CAAC,CAAC;aAC/B;AACL,SAAC,CAAC;QAEF,IAAI,SAAS,GAAyC,IAAI,CAAC;AAE3D,QAAA,OAAO,kBAAkB,CAAC;AACtB,YAAA,IAAI,EAAE,UAAU;AAChB,YAAA,UAAU,EAAE,YAAY;AACxB,YAAA,WAAW,EAAE,YAAY;AACzB,YAAA,UAAU,EAAE,eAAe;AAC3B,YAAA,WAAW,EAAE,CAAC,KAAK,KAAI;gBACnB,YAAY,CAAC,KAAK,CAAC,CAAC;AACpB,gBAAA,IAAI,SAAS,KAAK,IAAI,EAAE;oBACpB,YAAY,CAAC,SAAS,CAAC,CAAC;iBAC3B;AACD,gBAAA,SAAS,GAAG,UAAU,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;aAC/C;AACJ,SAAA,CAAC,CAAC;AACP,KAAC,EAAE,CAAC,oBAAoB,CAAC,CAAC,CAAC;AAE3B,IAAA,MAAM,mBAAmB,GAAG,WAAW,CAAC,MAAK;AACzC,QAAA,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;YACvB,OAAO;SACV;QAED,QAAQ,CAAC,OAAO,CAAC,gBAAgB,GAAG,YAAY,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC;QACjF,QAAQ,CAAC,OAAO,CAAC,WAAW,GAAG,eAAe,CAC1C,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAC/B,QAAQ,CAAC,OAAO,CAAC,gBAAgB,CAAC,KAAK,EACvC,aAAa,CAChB,CAAC;QAEF,MAAM,eAAe,GAAG,QAAQ,CAAC,OAAO,CAAC,gBAAgB,CAAC,MAAM,CAAC;QACjE,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,KAAI;AAC7C,YAAA,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,GAAG,WAAW,CAAC;AACrD,YAAA,IAAI,CAAC,aAAa,IAAI,CAAC,aAAa,EAAE;gBAClC,OAAO;aACV;AAED,YAAA,IAAI,WAAW,CAAC,QAAQ,EAAE;gBACtB,MAAM,UAAU,GACZ,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,IAAI,WAAW,CAAC,SAAS,GAAG,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAC5F,gBAAA,IAAI,WAAW,CAAC,UAAU,KAAK,UAAU,EAAE;AACvC,oBAAA,WAAW,CAAC,UAAU,GAAG,UAAU,CAAC;AACpC,oBAAA,WAAW,CAAC,UAAU;AAClB,wBAAA,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,UAAU,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC,SAAS,GAAG,WAAW,CAAC;oBACjF,aAAa,CAAC,KAAK,CAAC,SAAS,GAAG,UAAU,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;oBACnE,WAAW,CAAC,CAAC,QAAQ,KAAK,QAAQ,GAAG,CAAC,CAAC,CAAC;iBAC3C;aACJ;YAED,WAAW,CAAC,gBAAgB,GAAG,IAAI,CAAC,GAAG,CACnC,WAAW,CAAC,QAAQ,GAAG,WAAW,CAAC,SAAS,GAAG,WAAW,CAAC,SAAS,GAAG,CAAC,GAAG,CAAC,EAC5E,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG,WAAW,CAAC,CAAC,EACrD,WAAW,GAAG,kBAAkB,GAAG,QAAQ,CAC9C,CAAC;AACF,YAAA,MAAM,kBAAkB,GAAG,CAAC,eAAe,GAAG,WAAW,CAAC,gBAAgB,GAAG,WAAW,IAAI,CAAC,CAAC;AAC9F,YAAA,MAAM,gBAAgB,GAAG,eAAe,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,gBAAgB,GAAG,WAAW,IAAI,CAAC,CAAC;AAChG,YAAA,aAAa,CAAC,KAAK,CAAC,SAAS,GAAG,CAAA;;8BAEd,kBAAkB,CAAA;AACzB,qBAAA,EAAA,kBAAkB,GAAG,EAAE,CAAA;AACvB,qBAAA,EAAA,gBAAgB,GAAG,EAAE,CAAA;8BACd,gBAAgB,CAAA;cAChC,CAAC;AACP,SAAC,CAAC,CAAC;KACN,EAAE,CAAC,WAAW,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC,CAAC;IAE9C,eAAe,CAAC,MAAK;QACjB,IAAI,QAAQ,CAAC,OAAO,CAAC,gBAAgB,KAAK,IAAI,EAAE;AAC5C,YAAA,mBAAmB,EAAE,CAAC;SACzB;AACL,KAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAE1B,eAAe,CAAC,MAAK;QACjB,IAAI,QAAQ,CAAC,OAAO,CAAC,gBAAgB,KAAK,IAAI,EAAE;AAC5C,YAAA,mBAAmB,EAAE,CAAC;SACzB;AACL,KAAC,CAAC,CAAC;;IAGH,SAAS,CAAC,MAAK;AACX,QAAA,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,WAAW,KAAI;AAC1D,YAAA,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,GAAG,WAAW,CAAC;AACrD,YAAA,IAAI,CAAC,aAAa,IAAI,CAAC,aAAa,EAAE;gBAClC,OAAO;aACV;AAED,YAAA,WAAW,CAAC,UAAU;AAClB,gBAAA,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,UAAU,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC,SAAS,GAAG,WAAW,CAAC;AAC/E,oBAAA,eAAe,CAAC,WAAW,CAAC,GAAG,WAAW,CAAC;YAC/C,aAAa,CAAC,KAAK,CAAC,SAAS,GAAG,UAAU,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;YAEnE,WAAW,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,WAAW,KAAI;AAC7C,gBAAA,IAAI,WAAW,KAAK,IAAI,EAAE;AACtB,oBAAA,WAAW,CAAC,KAAK,CAAC,SAAS,GAAG,EAAE,CAAC;iBACpC;AACL,aAAC,CAAC,CAAC;AACP,SAAC,CAAC,CAAC;AACP,KAAC,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC;IAEtB,IAAI,CAAC,OAAO,EAAE;AACV,QAAA,OAAO,IAAI,CAAC;KACf;AAED,IAAA,MAAM,aAAa,GAAG,CAAC,UAAkB,EAAE,QAAgB,KAAI;AAC3D,QAAA,OAAO,KAAK,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,WAAW,KAAI;YACnD,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;YAC1D,QACIA,aACI,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,aAAa,EAAE;AACxC,oBAAA,CAAC,MAAM,CAAC,iBAAiB,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;oBACpE,CAAC,MAAM,CAAC,sBAAsB,GAAG,OAAO,CAAC,MAAM,KAAK,CAAC;AACxD,iBAAA,CAAC,EAEF,GAAG,EAAE,WAAW,CAAC,qBAAqB,EAAA,QAAA,EAEtCA,GAAK,CAAA,KAAA,EAAA,EAAA,SAAS,EAAE,MAAM,CAAC,qBAAqB,EAAA,QAAA,EACxCA,aAAK,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,EAAE,WAAW,CAAC,qBAAqB,EAChE,QAAA,EAAA,CAAC,GAAG,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,gBAAgB,KAChE,OAAO,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,SAAS,MAC3CA,GACI,CAAA,KAAA,EAAA,EAAA,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE;AAC/B,gCAAA,CAAC,MAAM,CAAC,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,KAAK,KAAK,MAAM;AACzD,gCAAA,CAAC,MAAM,CAAC,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,KAAK,KAAK,OAAO;AAC3D,gCAAA,CAAC,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ;gCAChC,CAAC,MAAM,CAAC,QAAQ,GACZ,SAAS,KAAK,eAAe,CAAC,WAAW,CAAC;AAC1C,qCAAC,CAAC,iBAAiB;AACf,wCAAA,WAAW,KAAK,QAAQ,CAAC,OAAO,CAAC,iBAAiB,CAAC;6BAC9D,CAAC,EAEF,GAAG,EAAE,WAAW,CAAC,oBAAoB,EAAE,GAAG,CACtC,gBAAgB,GAAG,WAAW,CAAC,SAAS,GAAG,SAAS,CACvD,EAEA,QAAA,EAAA,IAAI,CAAC,IAAI,EALL,EAAA,CAAA,EAAG,gBAAgB,CAAA,CAAA,EAAI,OAAO,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,MAAM,CAAA,CAAA,EAAI,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,CAAA,CAAE,CAMtF,CACT,CAAC,CACL,EACC,CAAA,EAAA,CACJ,EA3BD,EAAA,CAAA,EAAG,OAAO,CAAC,MAAM,CAAA,CAAA,EAAI,WAAW,CAAA,CAAE,CA4BrC,EACR;AACN,SAAC,CAAC,CAAC;AACP,KAAC,CAAC;IAEF,IAAI,aAAa,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,EAAE;QAC3C,QACIC,IAAK,CAAA,KAAA,EAAA,EAAA,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,GAAG,aAAa,EAAE,CAAC,EAAE,GAAG,EAAE,YAAY,EACtG,QAAA,EAAA,CAAAD,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,MAAM,CAAC,sBAAsB,EAAI,CAAA,EACjDC,IAAK,CAAA,KAAA,EAAA,EAAA,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,EAAA,QAAA,EAAA,CACrC,aAAa,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,EACrCD,GAAK,CAAA,KAAA,EAAA,EAAA,SAAS,EAAE,MAAM,CAAC,aAAa,EAAA,QAAA,EAChCA,GAAK,CAAA,KAAA,EAAA,EAAA,SAAS,EAAE,MAAM,CAAC,qBAAqB,EACxC,QAAA,EAAAA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,MAAM,CAAC,MAAM,EACzB,QAAA,EAAAA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,uBAAS,EAC/D,CAAA,EAAA,CACJ,EACJ,CAAA,EACL,aAAa,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA,EAAA,CAChD,EACNA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,MAAM,CAAC,kBAAkB,EAAA,CAAI,CAC3C,EAAA,CAAA,EACR;KACL;AAED,IAAA,QACIC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,GAAG,aAAa,EAAE,CAAC,EAAE,GAAG,EAAE,YAAY,EACtG,QAAA,EAAA,CAAAD,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,MAAM,CAAC,sBAAsB,EAAI,CAAA,EACjDA,GAAK,CAAA,KAAA,EAAA,EAAA,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,EAAA,QAAA,EAAG,aAAa,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,EAAO,CAAA,EACpFA,GAAK,CAAA,KAAA,EAAA,EAAA,SAAS,EAAE,MAAM,CAAC,kBAAkB,EAAI,CAAA,CAAA,EAAA,CAC3C,EACR;AACN,EAAE;AAEF,WAAW,CAAC,8BAA8B,GAAG,IAAI;;;;"}
@@ -4,6 +4,7 @@ import { useState, useRef, useCallback } from 'react';
4
4
  import { PickerWheel } from './PickerWheel.js';
5
5
  import 'classnames';
6
6
  import '@hh.ru/magritte-internal-custom-scroll';
7
+ import '@hh.ru/magritte-ui-bottom-sheet';
7
8
  import '@hh.ru/magritte-ui-breakpoint';
8
9
 
9
10
  const UncontrolledPickerWheel = ({ selectedIndexes: initialSelectedIndexes, onChange, ...props }) => {
@@ -16,6 +17,7 @@ const UncontrolledPickerWheel = ({ selectedIndexes: initialSelectedIndexes, onCh
16
17
  }, [setSelectedIndexes]);
17
18
  return jsx(PickerWheel, { selectedIndexes: selectedIndexes, onChange: handleChange, ...props });
18
19
  };
20
+ UncontrolledPickerWheel.isFullHeightBottomSheetContent = true;
19
21
 
20
22
  export { UncontrolledPickerWheel };
21
23
  //# sourceMappingURL=UncontrolledPickerWheel.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"UncontrolledPickerWheel.js","sources":["../src/UncontrolledPickerWheel.tsx"],"sourcesContent":["import { useCallback, useRef, useState } from 'react';\n\nimport { PickerWheel } from '@hh.ru/magritte-ui-picker-wheel/PickerWheel';\nimport { PickerWheelComponent } from '@hh.ru/magritte-ui-picker-wheel/types';\n\nexport const UncontrolledPickerWheel: PickerWheelComponent = ({\n selectedIndexes: initialSelectedIndexes,\n onChange,\n ...props\n}) => {\n const [selectedIndexes, setSelectedIndexes] = useState(initialSelectedIndexes);\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n\n const handleChange = useCallback(\n (value: Array<number | null>) => {\n onChangeRef.current?.(value as typeof initialSelectedIndexes);\n setSelectedIndexes(value as typeof initialSelectedIndexes);\n },\n [setSelectedIndexes]\n );\n\n return <PickerWheel selectedIndexes={selectedIndexes} onChange={handleChange} {...props} />;\n};\n"],"names":["_jsx"],"mappings":";;;;;;;AAKa,MAAA,uBAAuB,GAAyB,CAAC,EAC1D,eAAe,EAAE,sBAAsB,EACvC,QAAQ,EACR,GAAG,KAAK,EACX,KAAI;IACD,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CAAC,sBAAsB,CAAC,CAAC;AAC/E,IAAA,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;AACrC,IAAA,WAAW,CAAC,OAAO,GAAG,QAAQ,CAAC;AAE/B,IAAA,MAAM,YAAY,GAAG,WAAW,CAC5B,CAAC,KAA2B,KAAI;AAC5B,QAAA,WAAW,CAAC,OAAO,GAAG,KAAsC,CAAC,CAAC;QAC9D,kBAAkB,CAAC,KAAsC,CAAC,CAAC;AAC/D,KAAC,EACD,CAAC,kBAAkB,CAAC,CACvB,CAAC;AAEF,IAAA,OAAOA,GAAC,CAAA,WAAW,EAAC,EAAA,eAAe,EAAE,eAAe,EAAE,QAAQ,EAAE,YAAY,EAAM,GAAA,KAAK,GAAI,CAAC;AAChG;;;;"}
1
+ {"version":3,"file":"UncontrolledPickerWheel.js","sources":["../src/UncontrolledPickerWheel.tsx"],"sourcesContent":["import { useCallback, useRef, useState } from 'react';\n\nimport { PickerWheel } from '@hh.ru/magritte-ui-picker-wheel/PickerWheel';\nimport { PickerWheelComponent } from '@hh.ru/magritte-ui-picker-wheel/types';\n\nexport const UncontrolledPickerWheel: PickerWheelComponent = ({\n selectedIndexes: initialSelectedIndexes,\n onChange,\n ...props\n}) => {\n const [selectedIndexes, setSelectedIndexes] = useState(initialSelectedIndexes);\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n\n const handleChange = useCallback(\n (value: Array<number>) => {\n onChangeRef.current?.(value);\n setSelectedIndexes(value);\n },\n [setSelectedIndexes]\n );\n\n return <PickerWheel selectedIndexes={selectedIndexes} onChange={handleChange} {...props} />;\n};\n\nUncontrolledPickerWheel.isFullHeightBottomSheetContent = true;\n"],"names":["_jsx"],"mappings":";;;;;;;;AAKa,MAAA,uBAAuB,GAAyB,CAAC,EAC1D,eAAe,EAAE,sBAAsB,EACvC,QAAQ,EACR,GAAG,KAAK,EACX,KAAI;IACD,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CAAC,sBAAsB,CAAC,CAAC;AAC/E,IAAA,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;AACrC,IAAA,WAAW,CAAC,OAAO,GAAG,QAAQ,CAAC;AAE/B,IAAA,MAAM,YAAY,GAAG,WAAW,CAC5B,CAAC,KAAoB,KAAI;AACrB,QAAA,WAAW,CAAC,OAAO,GAAG,KAAK,CAAC,CAAC;QAC7B,kBAAkB,CAAC,KAAK,CAAC,CAAC;AAC9B,KAAC,EACD,CAAC,kBAAkB,CAAC,CACvB,CAAC;AAEF,IAAA,OAAOA,GAAC,CAAA,WAAW,EAAC,EAAA,eAAe,EAAE,eAAe,EAAE,QAAQ,EAAE,YAAY,EAAM,GAAA,KAAK,GAAI,CAAC;AAChG,EAAE;AAEF,uBAAuB,CAAC,8BAA8B,GAAG,IAAI;;;;"}
package/index.css CHANGED
@@ -4,14 +4,6 @@
4
4
  --magritte-color-component-time-picker-background-selection-v21-3-2:#F1F4F9;
5
5
  }
6
6
  :root{
7
- --magritte-typography-title-4-semibold-font-family-v21-3-2:"hh sans";
8
- --magritte-typography-title-4-semibold-font-weight-v21-3-2:500;
9
- --magritte-typography-title-4-semibold-line-height-v21-3-2:32px;
10
- --magritte-typography-title-4-semibold-font-size-v21-3-2:22px;
11
- --magritte-typography-title-4-semibold-letter-spacing-v21-3-2:-0.0075em;
12
- --magritte-typography-title-4-semibold-text-indent-v21-3-2:0px;
13
- --magritte-typography-title-4-semibold-text-transform-v21-3-2:none;
14
- --magritte-typography-title-4-semibold-text-decoration-v21-3-2:none;
15
7
  --magritte-typography-label-1-regular-font-family-v21-3-2:"hh sans";
16
8
  --magritte-typography-label-1-regular-font-weight-v21-3-2:400;
17
9
  --magritte-typography-label-1-regular-line-height-v21-3-2:26px;
@@ -26,47 +18,49 @@
26
18
  --magritte-color-text-state-primary-disabled-v21-3-2:#ababab7a;
27
19
  --magritte-color-component-time-picker-background-selection-v21-3-2:#262626;
28
20
  }
29
- .magritte-picker-wheel___VaPvG_1-0-3{
21
+ .magritte-picker-wheel___VaPvG_1-0-5{
30
22
  position:relative;
23
+ height:100%;
31
24
  }
32
- .magritte-selected-item-background___UnBPm_1-0-3{
25
+ .magritte-selected-item-background___UnBPm_1-0-5{
33
26
  position:absolute;
34
- inset:calc(50% - 48px / 2) 16px;
27
+ inset:calc(50% - 48px / 2) 0;
35
28
  background-color:var(--magritte-color-component-time-picker-background-selection-v21-3-2);
36
29
  }
37
- .magritte-columns___I7bCB_1-0-3{
30
+ .magritte-columns___I7bCB_1-0-5{
38
31
  position:relative;
32
+ height:100%;
39
33
  display:flex;
40
- align-items:center;
34
+ align-items:stretch;
41
35
  justify-content:center;
42
- overflow:clip;
43
36
  }
44
- .magritte-touch-events-overlay___c3YOp_1-0-3{
37
+ .magritte-touch-events-overlay___c3YOp_1-0-5{
45
38
  position:absolute;
46
39
  inset:0;
47
40
  }
48
- .magritte-fixed-height___BLw9W_1-0-3{
41
+ .magritte-fixed-height___BLw9W_1-0-5{
49
42
  height:336px;
50
43
  }
51
- .magritte-column-wrapper___yRwai_1-0-3{
52
- position:relative;
44
+ .magritte-column-wrapper___yRwai_1-0-5{
53
45
  flex:0 0 64px;
54
- max-height:100%;
46
+ position:relative;
55
47
  }
56
- .magritte-circular-column-wrapper___4KG7c_1-0-3{
57
- overflow:clip;
48
+ .magritte-column-position-wrapper___wQTIu_1-0-5{
49
+ position:relative;
50
+ top:50%;
51
+ margin-top:-24px;
58
52
  }
59
- .magritte-wide-column-wrapper___nvecx_1-0-3{
53
+ .magritte-wide-column-wrapper___nvecx_1-0-5{
60
54
  flex:0 0 105px;
61
55
  }
62
- .magritte-full-width-column-wrapper___oxhh1_1-0-3{
56
+ .magritte-full-width-column-wrapper___oxhh1_1-0-5{
63
57
  flex:0 0 100%;
64
58
  }
65
- .magritte-column___IMYca_1-0-3{
59
+ .magritte-column___IMYca_1-0-5{
66
60
  will-change:transform;
67
61
  transform:translate3d(0, 0, 0);
68
62
  }
69
- .magritte-item___4RQVs_1-0-3{
63
+ .magritte-item___4RQVs_1-0-5{
70
64
  font-family:var(--magritte-typography-label-1-regular-font-family-v21-3-2);
71
65
  font-weight:var(--magritte-typography-label-1-regular-font-weight-v21-3-2);
72
66
  line-height:var(--magritte-typography-label-1-regular-line-height-v21-3-2);
@@ -76,27 +70,27 @@
76
70
  text-transform:var(--magritte-typography-label-1-regular-text-transform-v21-3-2);
77
71
  text-decoration:var(--magritte-typography-label-1-regular-text-decoration-v21-3-2);
78
72
  color:var(--magritte-color-text-primary-v21-3-2);
79
- height:48px;
80
- line-height:48px;
73
+ height:18px;
74
+ line-height:18px;
75
+ padding:calc((48px - 18px) / 2) 0;
81
76
  text-align:center;
77
+ transform-origin:center center;
82
78
  }
83
- .magritte-item___4RQVs_1-0-3.magritte-align-left___PXJt0_1-0-3{
79
+ .magritte-item___4RQVs_1-0-5.magritte-align-left___PXJt0_1-0-5{
84
80
  text-align:left;
81
+ transform-origin:left center;
85
82
  }
86
- .magritte-item___4RQVs_1-0-3.magritte-align-right___0yc2S_1-0-3{
83
+ .magritte-item___4RQVs_1-0-5.magritte-align-right___0yc2S_1-0-5{
87
84
  text-align:right;
85
+ transform-origin:right center;
88
86
  }
89
- .magritte-item___4RQVs_1-0-3.magritte-disabled___d3ukm_1-0-3{
87
+ .magritte-item___4RQVs_1-0-5.magritte-disabled___d3ukm_1-0-5{
90
88
  color:var(--magritte-color-text-state-primary-disabled-v21-3-2);
91
89
  }
92
- .magritte-item___4RQVs_1-0-3.magritte-selected___Nar3H_1-0-3{
93
- font-family:var(--magritte-typography-title-4-semibold-font-family-v21-3-2);
94
- font-weight:var(--magritte-typography-title-4-semibold-font-weight-v21-3-2);
95
- line-height:var(--magritte-typography-title-4-semibold-line-height-v21-3-2);
96
- font-size:var(--magritte-typography-title-4-semibold-font-size-v21-3-2);
97
- letter-spacing:var(--magritte-typography-title-4-semibold-letter-spacing-v21-3-2);
98
- text-indent:var(--magritte-typography-title-4-semibold-text-indent-v21-3-2);
99
- text-transform:var(--magritte-typography-title-4-semibold-text-transform-v21-3-2);
100
- text-decoration:var(--magritte-typography-title-4-semibold-text-decoration-v21-3-2);
101
- line-height:48px;
90
+ .magritte-item___4RQVs_1-0-5.magritte-selected___Nar3H_1-0-5{
91
+ font-weight:500;
92
+ height:22px;
93
+ line-height:22px;
94
+ padding:calc((48px - 22px) / 2) 0;
95
+ transform:scale(1.22222222);
102
96
  }
package/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export * from '@hh.ru/magritte-ui-theme-provider';
2
2
  export * from '@hh.ru/magritte-ui-picker-wheel/types';
3
+ export * from '@hh.ru/magritte-ui-picker-wheel/itemsFromRange';
3
4
  export { PickerWheel } from '@hh.ru/magritte-ui-picker-wheel/PickerWheel';
4
5
  export { UncontrolledPickerWheel } from '@hh.ru/magritte-ui-picker-wheel/UncontrolledPickerWheel';
package/index.js CHANGED
@@ -1,10 +1,12 @@
1
1
  import './index.css';
2
2
  export * from '@hh.ru/magritte-ui-theme-provider';
3
+ export { itemsFromRange } from './itemsFromRange.js';
3
4
  export { PickerWheel } from './PickerWheel.js';
4
5
  export { UncontrolledPickerWheel } from './UncontrolledPickerWheel.js';
5
6
  import 'react/jsx-runtime';
6
7
  import 'react';
7
8
  import 'classnames';
8
9
  import '@hh.ru/magritte-internal-custom-scroll';
10
+ import '@hh.ru/magritte-ui-bottom-sheet';
9
11
  import '@hh.ru/magritte-ui-breakpoint';
10
12
  //# sourceMappingURL=index.js.map
package/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;"}
@@ -0,0 +1,2 @@
1
+ import { PickerWheelItem } from '@hh.ru/magritte-ui-picker-wheel/types';
2
+ export declare const itemsFromRange: (start: number, end: number, discreteness?: number) => Array<PickerWheelItem>;
@@ -0,0 +1,11 @@
1
+ import './index.css';
2
+ const itemsFromRange = (start, end, discreteness = 1) => {
3
+ const result = [];
4
+ for (let i = start; discreteness > 0 ? i <= end : i > discreteness; i += discreteness) {
5
+ result.push({ text: `${i}` });
6
+ }
7
+ return result;
8
+ };
9
+
10
+ export { itemsFromRange };
11
+ //# sourceMappingURL=itemsFromRange.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"itemsFromRange.js","sources":["../src/itemsFromRange.ts"],"sourcesContent":["import { PickerWheelItem } from '@hh.ru/magritte-ui-picker-wheel/types';\n\nexport const itemsFromRange = (start: number, end: number, discreteness: number = 1): Array<PickerWheelItem> => {\n const result = [];\n for (let i = start; discreteness > 0 ? i <= end : i > discreteness; i += discreteness) {\n result.push({ text: `${i}` });\n }\n return result;\n};\n"],"names":[],"mappings":"AAEO,MAAM,cAAc,GAAG,CAAC,KAAa,EAAE,GAAW,EAAE,YAAA,GAAuB,CAAC,KAA4B;IAC3G,MAAM,MAAM,GAAG,EAAE,CAAC;IAClB,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,YAAY,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,GAAG,YAAY,EAAE,CAAC,IAAI,YAAY,EAAE;QACnF,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAA,EAAG,CAAC,CAAA,CAAE,EAAE,CAAC,CAAC;KACjC;AACD,IAAA,OAAO,MAAM,CAAC;AAClB;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hh.ru/magritte-ui-picker-wheel",
3
- "version": "1.0.3",
3
+ "version": "1.0.5",
4
4
  "main": "index.js",
5
5
  "types": "index.d.ts",
6
6
  "sideEffects": [
@@ -22,9 +22,11 @@
22
22
  "dependencies": {
23
23
  "@hh.ru/magritte-design-tokens": "21.3.2",
24
24
  "@hh.ru/magritte-internal-custom-scroll": "1.4.0",
25
+ "@hh.ru/magritte-types": "5.0.1",
26
+ "@hh.ru/magritte-ui-bottom-sheet": "7.1.3",
25
27
  "@hh.ru/magritte-ui-breakpoint": "5.0.0",
26
28
  "@hh.ru/magritte-ui-theme-provider": "1.1.41",
27
- "@hh.ru/magritte-ui-typography": "3.0.31"
29
+ "@hh.ru/magritte-ui-typography": "3.0.32"
28
30
  },
29
31
  "peerDependencies": {
30
32
  "classnames": ">=2.3.2",
@@ -33,5 +35,5 @@
33
35
  "publishConfig": {
34
36
  "access": "public"
35
37
  },
36
- "gitHead": "701d9de63f5201fe61f21bbc9f0252a59201c9e3"
38
+ "gitHead": "d12e0d9910ca5fb5323a5312386cb48255aa5ca6"
37
39
  }
package/types.d.ts CHANGED
@@ -1,6 +1,4 @@
1
- export type ArrayWithLength<Item, Length> = Array<Item> & {
2
- length: Length;
3
- };
1
+ import { FcWithFlag } from '@hh.ru/magritte-types';
4
2
  export interface PickerWheelItem {
5
3
  disabled?: boolean;
6
4
  key?: React.Key;
@@ -11,14 +9,15 @@ export interface PickerWheelColumn {
11
9
  circular?: boolean;
12
10
  items: Array<PickerWheelItem>;
13
11
  }
14
- export interface PickerWheelProps<ColumnCount extends 1 | 2 | 3 | 4> {
15
- /** Устанавливает фиксированную высоту в 7 айтемов. Нужно использовать, если компонент используется вне боттомшита */
12
+ export interface PickerWheelProps {
13
+ /** Форсирует фиксированную высоту в 7 айтемов внутри боттомшита с height='full-screen' */
16
14
  fixedHeight?: boolean;
17
- columns: ArrayWithLength<PickerWheelColumn, ColumnCount>;
18
- onChange?: (selectedIndexes: ArrayWithLength<number, ColumnCount>) => void;
19
- selectedIndexes: ArrayWithLength<number, ColumnCount>;
20
- showDelimiter?: ColumnCount extends 2 | 4 ? boolean : false;
21
- }
22
- export interface PickerWheelComponent {
23
- <ColumnCount extends 1 | 2 | 3 | 4>(props: PickerWheelProps<ColumnCount>): React.ReactElement | null;
15
+ /** Массив колонок длиной 1..4 */
16
+ columns: Array<PickerWheelColumn>;
17
+ onChange?: (selectedIndexes: Array<number>) => void;
18
+ /** Массив выбранных индексов, совпадающий по длине с columns */
19
+ selectedIndexes: Array<number>;
20
+ /** Показывать ли разделитель, работает только при длине columns равной 2 или 4 */
21
+ showDelimiter?: boolean;
24
22
  }
23
+ export type PickerWheelComponent = FcWithFlag<PickerWheelProps, 'isFullHeightBottomSheetContent'>;