@hh.ru/magritte-ui-picker-wheel 2.1.114 → 2.1.116
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.d.ts +1 -1
- package/PickerWheel.js +349 -318
- package/PickerWheel.js.map +1 -1
- package/UncontrolledPickerWheel.d.ts +1 -1
- package/UncontrolledPickerWheel.js +16 -9
- package/UncontrolledPickerWheel.js.map +1 -1
- package/index.css +24 -24
- package/index.d.ts +4 -4
- package/itemsFromRange.d.ts +1 -1
- package/itemsFromRange.js +5 -5
- package/itemsFromRange.js.map +1 -1
- package/package.json +5 -5
package/PickerWheel.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { PickerWheelComponent } from '
|
|
1
|
+
import { PickerWheelComponent } from './types';
|
|
2
2
|
export declare const PickerWheel: PickerWheelComponent;
|
package/PickerWheel.js
CHANGED
|
@@ -6,352 +6,383 @@ import { initScrollHandlers } from '@hh.ru/magritte-internal-custom-scroll';
|
|
|
6
6
|
import { BottomSheetContext } from '@hh.ru/magritte-ui-bottom-sheet';
|
|
7
7
|
import { useBreakpoint } from '@hh.ru/magritte-ui-breakpoint';
|
|
8
8
|
|
|
9
|
-
var styles = {"picker-wheel":"magritte-picker-wheel___VaPvG_2-1-
|
|
9
|
+
var styles = {"picker-wheel":"magritte-picker-wheel___VaPvG_2-1-116","pickerWheel":"magritte-picker-wheel___VaPvG_2-1-116","selected-item-background":"magritte-selected-item-background___UnBPm_2-1-116","selectedItemBackground":"magritte-selected-item-background___UnBPm_2-1-116","columns":"magritte-columns___I7bCB_2-1-116","touch-events-overlay":"magritte-touch-events-overlay___c3YOp_2-1-116","touchEventsOverlay":"magritte-touch-events-overlay___c3YOp_2-1-116","fixed-height":"magritte-fixed-height___BLw9W_2-1-116","fixedHeight":"magritte-fixed-height___BLw9W_2-1-116","column-wrapper":"magritte-column-wrapper___yRwai_2-1-116","columnWrapper":"magritte-column-wrapper___yRwai_2-1-116","column-position-wrapper":"magritte-column-position-wrapper___wQTIu_2-1-116","columnPositionWrapper":"magritte-column-position-wrapper___wQTIu_2-1-116","wide-column-wrapper":"magritte-wide-column-wrapper___nvecx_2-1-116","wideColumnWrapper":"magritte-wide-column-wrapper___nvecx_2-1-116","full-width-column-wrapper":"magritte-full-width-column-wrapper___oxhh1_2-1-116","fullWidthColumnWrapper":"magritte-full-width-column-wrapper___oxhh1_2-1-116","column":"magritte-column___IMYca_2-1-116","item":"magritte-item___4RQVs_2-1-116","align-left":"magritte-align-left___PXJt0_2-1-116","alignLeft":"magritte-align-left___PXJt0_2-1-116","align-right":"magritte-align-right___0yc2S_2-1-116","alignRight":"magritte-align-right___0yc2S_2-1-116","disabled":"magritte-disabled___d3ukm_2-1-116","selected":"magritte-selected___Nar3H_2-1-116"};
|
|
10
10
|
|
|
11
11
|
const FIXED_HEIGHT_ITEMS = 7;
|
|
12
12
|
const ITEM_HEIGHT = 48;
|
|
13
13
|
const COLUMN_WIDTH = 64;
|
|
14
14
|
const WIDE_COLUMN_WIDTH = 105;
|
|
15
15
|
const SELECTED_ITEM_SCALE = 22 / 18;
|
|
16
|
-
/**
|
|
17
|
-
* Превращает массив точек в массив интервалов
|
|
18
|
-
* [0, 50, 100, 200] => [{ left: 0, right: 50 }, { left: 50, right: 100 }, { left: 100, right: 200 }]
|
|
19
|
-
*/
|
|
20
16
|
const makeIntervalsFromPoints = (...points) => {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
17
|
+
return points.flatMap((point, index) => {
|
|
18
|
+
if (index !== 0 && index !== points.length - 1) {
|
|
19
|
+
return [point, point];
|
|
20
|
+
}
|
|
21
|
+
return point;
|
|
22
|
+
}).reduce(
|
|
23
|
+
(intervals, point, index) => {
|
|
24
|
+
if (index % 2 === 0) {
|
|
25
|
+
return [...intervals, { left: point }];
|
|
26
|
+
}
|
|
27
|
+
const interval = { ...intervals[intervals.length - 1], right: point };
|
|
28
|
+
return [...intervals.slice(0, intervals.length - 1), interval];
|
|
29
|
+
},
|
|
30
|
+
[]
|
|
31
|
+
);
|
|
35
32
|
};
|
|
36
|
-
/**
|
|
37
|
-
* Генерирует горизонтальные границы в пикселях относительно контейнера, в которых колонки должны реагировать на скролл
|
|
38
|
-
*/
|
|
39
33
|
const makeScrollAreas = (columnCount, containerWidth, showDelimiter) => {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
34
|
+
switch (columnCount) {
|
|
35
|
+
case 1:
|
|
36
|
+
return makeIntervalsFromPoints(0, containerWidth);
|
|
37
|
+
case 2:
|
|
38
|
+
return makeIntervalsFromPoints(0, containerWidth / 2, containerWidth);
|
|
39
|
+
case 3:
|
|
40
|
+
return makeIntervalsFromPoints(
|
|
41
|
+
0,
|
|
42
|
+
(containerWidth - WIDE_COLUMN_WIDTH) / 2,
|
|
43
|
+
(containerWidth + WIDE_COLUMN_WIDTH) / 2,
|
|
44
|
+
containerWidth
|
|
45
|
+
);
|
|
46
|
+
case 4:
|
|
47
|
+
if (showDelimiter) {
|
|
48
|
+
return makeIntervalsFromPoints(
|
|
49
|
+
0,
|
|
50
|
+
containerWidth / 2 - COLUMN_WIDTH * 1.5,
|
|
51
|
+
containerWidth / 2,
|
|
52
|
+
containerWidth / 2 + COLUMN_WIDTH * 1.5,
|
|
53
|
+
containerWidth
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
return makeIntervalsFromPoints(
|
|
57
|
+
0,
|
|
58
|
+
containerWidth / 2 - COLUMN_WIDTH,
|
|
59
|
+
containerWidth / 2,
|
|
60
|
+
containerWidth / 2 + COLUMN_WIDTH,
|
|
61
|
+
containerWidth
|
|
62
|
+
);
|
|
63
|
+
default:
|
|
64
|
+
throw new Error("Unexpected column count");
|
|
65
|
+
}
|
|
55
66
|
};
|
|
56
|
-
const floorToOdd = (value) =>
|
|
67
|
+
const floorToOdd = (value) => value % 2 !== 1 ? value - 1 : value;
|
|
57
68
|
const range = (start, end) => {
|
|
58
|
-
|
|
69
|
+
return [...Array(end - start).keys()].map((_, index) => index + start);
|
|
59
70
|
};
|
|
60
71
|
const translateY = (value) => `translate3d(0, ${value}px, 0)`;
|
|
61
72
|
const makeInitialState = (columns) => {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
73
|
+
return {
|
|
74
|
+
activeColumnIndex: null,
|
|
75
|
+
animations: [],
|
|
76
|
+
containerMetrics: null,
|
|
77
|
+
columns: columns.map((column) => {
|
|
78
|
+
const itemElementCallbacks = /* @__PURE__ */ new Map();
|
|
79
|
+
const columnState = {
|
|
80
|
+
circular: column.circular,
|
|
81
|
+
cloneCount: 1,
|
|
82
|
+
disabledItems: /* @__PURE__ */ new Set(),
|
|
83
|
+
itemCount: column.items.length,
|
|
84
|
+
translateY: 0,
|
|
85
|
+
visibleItemCount: null,
|
|
86
|
+
columnElement: null,
|
|
87
|
+
columnElementCallback: (element) => columnState.columnElement = element,
|
|
88
|
+
columnWrapper: null,
|
|
89
|
+
columnWrapperCallback: (element) => columnState.columnWrapper = element,
|
|
90
|
+
itemElements: /* @__PURE__ */ new Map(),
|
|
91
|
+
itemElementCallbacks: {
|
|
92
|
+
get: (itemIndex) => {
|
|
93
|
+
if (!itemElementCallbacks.has(itemIndex)) {
|
|
94
|
+
itemElementCallbacks.set(itemIndex, (element) => {
|
|
95
|
+
columnState.itemElements.set(itemIndex, element);
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
return itemElementCallbacks.get(itemIndex);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
return columnState;
|
|
103
|
+
}),
|
|
104
|
+
scrollAreas: null,
|
|
105
|
+
scrollDirection: null
|
|
106
|
+
};
|
|
96
107
|
};
|
|
97
|
-
const PickerWheel = ({
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
+
const PickerWheel = ({
|
|
109
|
+
columns,
|
|
110
|
+
fixedHeight,
|
|
111
|
+
onChange,
|
|
112
|
+
selectedIndexes,
|
|
113
|
+
showDelimiter
|
|
114
|
+
}) => {
|
|
115
|
+
if (columns.length !== selectedIndexes.length) {
|
|
116
|
+
throw new Error("selectedIndexes.length does not match columns.length");
|
|
117
|
+
}
|
|
118
|
+
const stateRef = useRef(makeInitialState(columns));
|
|
119
|
+
if (columns.length !== stateRef.current.columns.length || columns.some((column, columnIndex) => {
|
|
120
|
+
return column.items.length !== stateRef.current.columns[columnIndex].itemCount || column.circular !== stateRef.current.columns[columnIndex].circular;
|
|
121
|
+
})) {
|
|
122
|
+
stateRef.current = makeInitialState(columns);
|
|
123
|
+
}
|
|
124
|
+
columns.forEach(
|
|
125
|
+
(column, columnIndex) => stateRef.current.columns[columnIndex].disabledItems = new Set(
|
|
126
|
+
column.items.reduce(
|
|
127
|
+
(result, item, itemIndex) => item.disabled ? [...result, itemIndex] : result,
|
|
128
|
+
[]
|
|
129
|
+
)
|
|
130
|
+
)
|
|
131
|
+
);
|
|
132
|
+
const bottomSheetContext = useContext(BottomSheetContext);
|
|
133
|
+
const containerRef = useRef(null);
|
|
134
|
+
const isFixedHeight = bottomSheetContext !== null && bottomSheetContext.height !== "full-screen" || fixedHeight;
|
|
135
|
+
const onChangeRef = useRef(onChange);
|
|
136
|
+
onChangeRef.current = onChange;
|
|
137
|
+
const selectedIndexesRef = useRef(selectedIndexes);
|
|
138
|
+
selectedIndexesRef.current = selectedIndexes;
|
|
139
|
+
const [_, setStateKey] = useState(0);
|
|
140
|
+
const [touchActionActive, setTouchActionActive] = useState(false);
|
|
141
|
+
const visible = useBreakpoint().isMobile;
|
|
142
|
+
useEffect(() => {
|
|
143
|
+
const container = containerRef.current;
|
|
144
|
+
if (!container) {
|
|
145
|
+
return void 0;
|
|
108
146
|
}
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
const
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
147
|
+
const setActiveColumn = (clientX) => {
|
|
148
|
+
const containerMetrics = stateRef.current.containerMetrics;
|
|
149
|
+
if (containerMetrics !== null) {
|
|
150
|
+
stateRef.current.activeColumnIndex = stateRef.current.scrollAreas?.findIndex((interval) => {
|
|
151
|
+
const relativeX = clientX - containerMetrics.left;
|
|
152
|
+
return relativeX >= interval.left && relativeX <= interval.right;
|
|
153
|
+
}) ?? null;
|
|
154
|
+
}
|
|
155
|
+
};
|
|
156
|
+
const handleTouchStart = (event) => {
|
|
157
|
+
event.preventDefault();
|
|
158
|
+
event.stopPropagation();
|
|
159
|
+
event.changedTouches.length === 1 && setActiveColumn(event.changedTouches[0].clientX);
|
|
160
|
+
};
|
|
161
|
+
const handleTouchMove = (event) => {
|
|
162
|
+
event.preventDefault();
|
|
163
|
+
event.stopPropagation();
|
|
164
|
+
};
|
|
165
|
+
const handleWheel = (event) => {
|
|
166
|
+
event.preventDefault();
|
|
167
|
+
event.stopPropagation();
|
|
168
|
+
setActiveColumn(event.clientX);
|
|
169
|
+
};
|
|
170
|
+
container.addEventListener("touchstart", handleTouchStart, { passive: false });
|
|
171
|
+
container.addEventListener("touchmove", handleTouchMove, { passive: false });
|
|
172
|
+
container.addEventListener("wheel", handleWheel, { passive: false });
|
|
173
|
+
return () => {
|
|
174
|
+
container.removeEventListener("touchstart", handleTouchStart);
|
|
175
|
+
container.removeEventListener("touchmove", handleTouchMove);
|
|
176
|
+
container.removeEventListener("wheel", handleWheel);
|
|
177
|
+
};
|
|
178
|
+
}, []);
|
|
179
|
+
useEffect(() => {
|
|
180
|
+
const handleScroll = (event) => {
|
|
181
|
+
if (stateRef.current.activeColumnIndex !== null && stateRef.current.containerMetrics !== null) {
|
|
182
|
+
const columnIndex = stateRef.current.activeColumnIndex;
|
|
183
|
+
const columnState = stateRef.current?.columns[columnIndex];
|
|
184
|
+
const { columnElement, columnWrapper } = columnState;
|
|
185
|
+
if (!columnState || !columnState.visibleItemCount || !columnElement || !columnWrapper) {
|
|
186
|
+
return;
|
|
124
187
|
}
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
}
|
|
135
|
-
};
|
|
136
|
-
const handleTouchStart = (event) => {
|
|
137
|
-
event.preventDefault();
|
|
138
|
-
event.stopPropagation();
|
|
139
|
-
event.changedTouches.length === 1 && setActiveColumn(event.changedTouches[0].clientX);
|
|
140
|
-
};
|
|
141
|
-
const handleTouchMove = (event) => {
|
|
142
|
-
event.preventDefault();
|
|
143
|
-
event.stopPropagation();
|
|
144
|
-
};
|
|
145
|
-
const handleWheel = (event) => {
|
|
146
|
-
event.preventDefault();
|
|
147
|
-
event.stopPropagation();
|
|
148
|
-
setActiveColumn(event.clientX);
|
|
149
|
-
};
|
|
150
|
-
container.addEventListener('touchstart', handleTouchStart, { passive: false });
|
|
151
|
-
container.addEventListener('touchmove', handleTouchMove, { passive: false });
|
|
152
|
-
container.addEventListener('wheel', handleWheel, { passive: false });
|
|
153
|
-
return () => {
|
|
154
|
-
container.removeEventListener('touchstart', handleTouchStart);
|
|
155
|
-
container.removeEventListener('touchmove', handleTouchMove);
|
|
156
|
-
container.removeEventListener('wheel', handleWheel);
|
|
157
|
-
};
|
|
158
|
-
}, []);
|
|
159
|
-
useEffect(() => {
|
|
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;
|
|
177
|
-
}
|
|
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;
|
|
186
|
-
}
|
|
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
|
-
}
|
|
234
|
-
}
|
|
235
|
-
else if (stateRef.current.scrollDirection === 'down') {
|
|
236
|
-
selectedItemIndex += 1;
|
|
237
|
-
if (selectedItemIndex > columnState.itemCount - 1) {
|
|
238
|
-
selectedItemIndex = 0;
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
else {
|
|
242
|
-
break;
|
|
243
|
-
}
|
|
244
|
-
} while (columnState.disabledItems.has(selectedItemIndex) &&
|
|
245
|
-
selectedItemIndex !== _selectedItemIndex);
|
|
246
|
-
}
|
|
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);
|
|
265
|
-
}
|
|
266
|
-
timeoutId = setTimeout(handleScrollEnd, 50);
|
|
267
|
-
},
|
|
268
|
-
});
|
|
269
|
-
}, [setTouchActionActive]);
|
|
270
|
-
const recalcLayoutMetrics = useCallback(() => {
|
|
271
|
-
if (!containerRef.current) {
|
|
272
|
-
return;
|
|
188
|
+
stateRef.current.scrollDirection = event.delta > 0 ? "up" : "down";
|
|
189
|
+
columnState.translateY += event.delta;
|
|
190
|
+
if (columnState.circular) {
|
|
191
|
+
if (event.delta > 0 && stateRef.current.containerMetrics.height / 2 + columnState.translateY > -100) {
|
|
192
|
+
columnState.translateY -= columnState.itemCount * ITEM_HEIGHT;
|
|
193
|
+
}
|
|
194
|
+
if (event.delta < 0 && columnState.cloneCount * columnState.itemCount * ITEM_HEIGHT + columnState.translateY - stateRef.current.containerMetrics.height / 2 < 100) {
|
|
195
|
+
columnState.translateY += columnState.itemCount * ITEM_HEIGHT;
|
|
196
|
+
}
|
|
273
197
|
}
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
198
|
+
if (!columnState.circular) {
|
|
199
|
+
if (event.delta > 0) {
|
|
200
|
+
const minAllowedTranslateY = 0;
|
|
201
|
+
columnState.translateY = Math.min(columnState.translateY, minAllowedTranslateY);
|
|
202
|
+
}
|
|
203
|
+
if (event.delta < 0) {
|
|
204
|
+
const maxAllowedTranslateY = (columnState.itemCount - 1) * ITEM_HEIGHT;
|
|
205
|
+
columnState.translateY = Math.max(columnState.translateY, -maxAllowedTranslateY);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
const selectedItemIndex = Math.round(-columnState.translateY / ITEM_HEIGHT);
|
|
209
|
+
if (columnState.itemElements.has(selectedItemIndex)) {
|
|
210
|
+
const halfItemHeight = ITEM_HEIGHT / 2;
|
|
211
|
+
columnState.itemElements.get(selectedItemIndex).style.transform = `scale(${1 + (SELECTED_ITEM_SCALE - 1) * Math.abs((Math.abs(columnState.translateY % ITEM_HEIGHT) - halfItemHeight) / halfItemHeight)})`;
|
|
212
|
+
}
|
|
213
|
+
columnElement.style.transform = translateY(columnState.translateY);
|
|
214
|
+
setTouchActionActive(true);
|
|
215
|
+
}
|
|
216
|
+
};
|
|
217
|
+
const handleScrollEnd = () => {
|
|
218
|
+
if (stateRef.current.activeColumnIndex !== null) {
|
|
219
|
+
const columnIndex = stateRef.current.activeColumnIndex;
|
|
220
|
+
const columnState = stateRef.current?.columns[columnIndex];
|
|
221
|
+
const { columnElement, columnWrapper } = columnState;
|
|
222
|
+
if (!columnState || !columnElement || !columnWrapper) {
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
const _selectedItemIndex = Math.round(Math.abs(columnState.translateY) / ITEM_HEIGHT) % columnState.itemCount;
|
|
226
|
+
let selectedItemIndex = _selectedItemIndex;
|
|
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
|
+
}
|
|
234
|
+
} else if (stateRef.current.scrollDirection === "down") {
|
|
235
|
+
selectedItemIndex += 1;
|
|
236
|
+
if (selectedItemIndex > columnState.itemCount - 1) {
|
|
237
|
+
selectedItemIndex = 0;
|
|
238
|
+
}
|
|
239
|
+
} else {
|
|
240
|
+
break;
|
|
291
241
|
}
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
242
|
+
} while (columnState.disabledItems.has(selectedItemIndex) && selectedItemIndex !== _selectedItemIndex);
|
|
243
|
+
}
|
|
244
|
+
const _selectedIndexes = [...selectedIndexesRef.current];
|
|
245
|
+
_selectedIndexes[columnIndex] = selectedItemIndex;
|
|
246
|
+
onChangeRef.current?.(_selectedIndexes);
|
|
247
|
+
stateRef.current.activeColumnIndex = null;
|
|
248
|
+
stateRef.current.scrollDirection = null;
|
|
249
|
+
setTouchActionActive(false);
|
|
250
|
+
}
|
|
251
|
+
};
|
|
252
|
+
let timeoutId = null;
|
|
253
|
+
return initScrollHandlers({
|
|
254
|
+
axis: "vertical",
|
|
255
|
+
wrapperRef: containerRef,
|
|
256
|
+
onTouchMove: handleScroll,
|
|
257
|
+
onTouchEnd: handleScrollEnd,
|
|
258
|
+
onWheelMove: (event) => {
|
|
259
|
+
handleScroll(event);
|
|
260
|
+
if (timeoutId !== null) {
|
|
261
|
+
clearTimeout(timeoutId);
|
|
262
|
+
}
|
|
263
|
+
timeoutId = setTimeout(handleScrollEnd, 50);
|
|
264
|
+
}
|
|
265
|
+
});
|
|
266
|
+
}, [setTouchActionActive]);
|
|
267
|
+
const recalcLayoutMetrics = useCallback(() => {
|
|
268
|
+
if (!containerRef.current) {
|
|
269
|
+
return;
|
|
270
|
+
}
|
|
271
|
+
stateRef.current.containerMetrics = containerRef.current.getBoundingClientRect();
|
|
272
|
+
stateRef.current.scrollAreas = makeScrollAreas(
|
|
273
|
+
stateRef.current.columns.length,
|
|
274
|
+
stateRef.current.containerMetrics.width,
|
|
275
|
+
showDelimiter
|
|
276
|
+
);
|
|
277
|
+
const containerHeight = stateRef.current.containerMetrics.height;
|
|
278
|
+
stateRef.current.columns.forEach((columnState) => {
|
|
279
|
+
const { columnElement, columnWrapper } = columnState;
|
|
280
|
+
if (!columnElement || !columnWrapper) {
|
|
281
|
+
return;
|
|
282
|
+
}
|
|
283
|
+
if (columnState.circular) {
|
|
284
|
+
const cloneCount = Math.max(Math.ceil(containerHeight / (columnState.itemCount * ITEM_HEIGHT)), 1) * 2 + 1;
|
|
285
|
+
if (columnState.cloneCount !== cloneCount) {
|
|
286
|
+
columnState.cloneCount = cloneCount;
|
|
287
|
+
columnState.translateY -= Math.floor(columnState.cloneCount / 2) * columnState.itemCount * ITEM_HEIGHT;
|
|
288
|
+
columnElement.style.transform = translateY(columnState.translateY);
|
|
289
|
+
setStateKey((stateKey) => stateKey + 1);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
columnState.visibleItemCount = Math.min(
|
|
293
|
+
columnState.circular ? columnState.itemCount : columnState.itemCount * 2 - 1,
|
|
294
|
+
floorToOdd(Math.floor(containerHeight / ITEM_HEIGHT)),
|
|
295
|
+
fixedHeight ? FIXED_HEIGHT_ITEMS : Infinity
|
|
296
|
+
);
|
|
297
|
+
const gradientStartPoint = (containerHeight - columnState.visibleItemCount * ITEM_HEIGHT) / 2;
|
|
298
|
+
const gradientEndPoint = containerHeight / 2 + columnState.visibleItemCount * ITEM_HEIGHT / 2;
|
|
299
|
+
columnWrapper.style.maskImage = `linear-gradient(
|
|
296
300
|
to bottom,
|
|
297
301
|
transparent ${gradientStartPoint}px,
|
|
298
302
|
#000 ${gradientStartPoint + 60}px,
|
|
299
303
|
#000 ${gradientEndPoint - 60}px,
|
|
300
304
|
transparent ${gradientEndPoint}px
|
|
301
305
|
)`;
|
|
302
|
-
});
|
|
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
306
|
});
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
if (!columnElement || !columnWrapper) {
|
|
319
|
-
return;
|
|
320
|
-
}
|
|
321
|
-
columnState.translateY =
|
|
322
|
-
-(Math.floor(columnState.cloneCount / 2) * columnState.itemCount * ITEM_HEIGHT) -
|
|
323
|
-
selectedIndexes[columnIndex] * ITEM_HEIGHT;
|
|
324
|
-
columnElement.style.transform = translateY(columnState.translateY);
|
|
325
|
-
columnState.itemElements.forEach((itemElement) => {
|
|
326
|
-
if (itemElement !== null) {
|
|
327
|
-
itemElement.style.transform = ``;
|
|
328
|
-
}
|
|
329
|
-
});
|
|
330
|
-
});
|
|
331
|
-
}, [selectedIndexes]);
|
|
332
|
-
if (!visible) {
|
|
333
|
-
return null;
|
|
307
|
+
}, [fixedHeight, showDelimiter, setStateKey]);
|
|
308
|
+
useLayoutEffect(() => {
|
|
309
|
+
if (stateRef.current.containerMetrics !== null) {
|
|
310
|
+
recalcLayoutMetrics();
|
|
334
311
|
}
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
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
|
-
});
|
|
350
|
-
};
|
|
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 })] }));
|
|
312
|
+
}, [recalcLayoutMetrics]);
|
|
313
|
+
useLayoutEffect(() => {
|
|
314
|
+
if (stateRef.current.containerMetrics === null) {
|
|
315
|
+
recalcLayoutMetrics();
|
|
353
316
|
}
|
|
354
|
-
|
|
317
|
+
});
|
|
318
|
+
useEffect(() => {
|
|
319
|
+
stateRef.current.columns.forEach((columnState, columnIndex) => {
|
|
320
|
+
const { columnElement, columnWrapper } = columnState;
|
|
321
|
+
if (!columnElement || !columnWrapper) {
|
|
322
|
+
return;
|
|
323
|
+
}
|
|
324
|
+
columnState.translateY = -(Math.floor(columnState.cloneCount / 2) * columnState.itemCount * ITEM_HEIGHT) - selectedIndexes[columnIndex] * ITEM_HEIGHT;
|
|
325
|
+
columnElement.style.transform = translateY(columnState.translateY);
|
|
326
|
+
columnState.itemElements.forEach((itemElement) => {
|
|
327
|
+
if (itemElement !== null) {
|
|
328
|
+
itemElement.style.transform = ``;
|
|
329
|
+
}
|
|
330
|
+
});
|
|
331
|
+
});
|
|
332
|
+
}, [selectedIndexes]);
|
|
333
|
+
if (!visible) {
|
|
334
|
+
return null;
|
|
335
|
+
}
|
|
336
|
+
const renderColumns = (startIndex, endIndex) => {
|
|
337
|
+
return range(startIndex, endIndex).map((columnIndex) => {
|
|
338
|
+
const columnState = stateRef.current.columns[columnIndex];
|
|
339
|
+
return /* @__PURE__ */ jsx(
|
|
340
|
+
"div",
|
|
341
|
+
{
|
|
342
|
+
className: classnames(styles.columnWrapper, {
|
|
343
|
+
[styles.wideColumnWrapper]: columns.length < 4 && columns.length > 1,
|
|
344
|
+
[styles.fullWidthColumnWrapper]: columns.length === 1
|
|
345
|
+
}),
|
|
346
|
+
ref: columnState.columnWrapperCallback,
|
|
347
|
+
children: /* @__PURE__ */ jsx("div", { className: styles.columnPositionWrapper, children: /* @__PURE__ */ jsx("div", { className: styles.column, ref: columnState.columnElementCallback, children: [...Array(columnState.cloneCount).keys()].flatMap(
|
|
348
|
+
(columnCloneIndex) => columns[columnIndex].items.map((item, itemIndex) => /* @__PURE__ */ jsx(
|
|
349
|
+
"div",
|
|
350
|
+
{
|
|
351
|
+
className: classnames(styles.item, {
|
|
352
|
+
[styles.alignLeft]: columns[columnIndex].align === "left",
|
|
353
|
+
[styles.alignRight]: columns[columnIndex].align === "right",
|
|
354
|
+
[styles.disabled]: item.disabled,
|
|
355
|
+
[styles.selected]: itemIndex === selectedIndexes[columnIndex] && (!touchActionActive || columnIndex !== stateRef.current.activeColumnIndex)
|
|
356
|
+
}),
|
|
357
|
+
ref: columnState.itemElementCallbacks?.get(
|
|
358
|
+
columnCloneIndex * columnState.itemCount + itemIndex
|
|
359
|
+
),
|
|
360
|
+
children: item.text
|
|
361
|
+
},
|
|
362
|
+
`${columnCloneIndex}-${columns[columnIndex].items.length}-${item.key ?? item.text}`
|
|
363
|
+
))
|
|
364
|
+
) }) })
|
|
365
|
+
},
|
|
366
|
+
`${columns.length}-${columnIndex}`
|
|
367
|
+
);
|
|
368
|
+
});
|
|
369
|
+
};
|
|
370
|
+
if (showDelimiter && columns.length % 2 === 0) {
|
|
371
|
+
return /* @__PURE__ */ jsxs("div", { className: classnames(styles.pickerWheel, { [styles.fixedHeight]: isFixedHeight }), ref: containerRef, children: [
|
|
372
|
+
/* @__PURE__ */ jsx("div", { className: styles.selectedItemBackground }),
|
|
373
|
+
/* @__PURE__ */ jsxs("div", { className: classnames(styles.columns), children: [
|
|
374
|
+
renderColumns(0, columns.length / 2),
|
|
375
|
+
/* @__PURE__ */ jsx("div", { className: styles.columnWrapper, children: /* @__PURE__ */ jsx("div", { className: styles.columnPositionWrapper, children: /* @__PURE__ */ jsx("div", { className: styles.column, children: /* @__PURE__ */ jsx("div", { className: classnames(styles.item, styles.selected), children: "\u2013" }) }) }) }),
|
|
376
|
+
renderColumns(columns.length / 2, columns.length)
|
|
377
|
+
] }),
|
|
378
|
+
/* @__PURE__ */ jsx("div", { className: styles.touchEventsOverlay })
|
|
379
|
+
] });
|
|
380
|
+
}
|
|
381
|
+
return /* @__PURE__ */ jsxs("div", { className: classnames(styles.pickerWheel, { [styles.fixedHeight]: isFixedHeight }), ref: containerRef, children: [
|
|
382
|
+
/* @__PURE__ */ jsx("div", { className: styles.selectedItemBackground }),
|
|
383
|
+
/* @__PURE__ */ jsx("div", { className: classnames(styles.columns), children: renderColumns(0, columns.length) }),
|
|
384
|
+
/* @__PURE__ */ jsx("div", { className: styles.touchEventsOverlay })
|
|
385
|
+
] });
|
|
355
386
|
};
|
|
356
387
|
PickerWheel.isFullHeightBottomSheetContent = true;
|
|
357
388
|
|
package/PickerWheel.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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 !== null && 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":"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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 !== null && 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":[],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { PickerWheelComponent } from '
|
|
1
|
+
import { PickerWheelComponent } from './types';
|
|
2
2
|
export declare const UncontrolledPickerWheel: PickerWheelComponent;
|
|
@@ -7,15 +7,22 @@ import '@hh.ru/magritte-internal-custom-scroll';
|
|
|
7
7
|
import '@hh.ru/magritte-ui-bottom-sheet';
|
|
8
8
|
import '@hh.ru/magritte-ui-breakpoint';
|
|
9
9
|
|
|
10
|
-
const UncontrolledPickerWheel = ({
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
10
|
+
const UncontrolledPickerWheel = ({
|
|
11
|
+
selectedIndexes: initialSelectedIndexes,
|
|
12
|
+
onChange,
|
|
13
|
+
...props
|
|
14
|
+
}) => {
|
|
15
|
+
const [selectedIndexes, setSelectedIndexes] = useState(initialSelectedIndexes);
|
|
16
|
+
const onChangeRef = useRef(onChange);
|
|
17
|
+
onChangeRef.current = onChange;
|
|
18
|
+
const handleChange = useCallback(
|
|
19
|
+
(value) => {
|
|
20
|
+
onChangeRef.current?.(value);
|
|
21
|
+
setSelectedIndexes(value);
|
|
22
|
+
},
|
|
23
|
+
[setSelectedIndexes]
|
|
24
|
+
);
|
|
25
|
+
return /* @__PURE__ */ jsx(PickerWheel, { selectedIndexes, onChange: handleChange, ...props });
|
|
19
26
|
};
|
|
20
27
|
UncontrolledPickerWheel.isFullHeightBottomSheetContent = true;
|
|
21
28
|
|
|
@@ -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>) => {\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":[
|
|
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":[],"mappings":";;;;;;;;AAKO,MAAM,0BAAgD,CAAC;AAAA,EAC1D,eAAiB,EAAA,sBAAA;AAAA,EACjB,QAAA;AAAA,EACA,GAAG,KAAA;AACP,CAAM,KAAA;AACF,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAI,SAAS,sBAAsB,CAAA,CAAA;AAC7E,EAAM,MAAA,WAAA,GAAc,OAAO,QAAQ,CAAA,CAAA;AACnC,EAAA,WAAA,CAAY,OAAU,GAAA,QAAA,CAAA;AAEtB,EAAA,MAAM,YAAe,GAAA,WAAA;AAAA,IACjB,CAAC,KAAyB,KAAA;AACtB,MAAA,WAAA,CAAY,UAAU,KAAK,CAAA,CAAA;AAC3B,MAAA,kBAAA,CAAmB,KAAK,CAAA,CAAA;AAAA,KAC5B;AAAA,IACA,CAAC,kBAAkB,CAAA;AAAA,GACvB,CAAA;AAEA,EAAA,2BAAQ,WAAY,EAAA,EAAA,eAAA,EAAkC,QAAU,EAAA,YAAA,EAAe,GAAG,KAAO,EAAA,CAAA,CAAA;AAC7F,EAAA;AAEA,uBAAA,CAAwB,8BAAiC,GAAA,IAAA;;;;"}
|
package/index.css
CHANGED
|
@@ -1,57 +1,57 @@
|
|
|
1
1
|
:root{
|
|
2
|
-
--magritte-color-text-primary-
|
|
3
|
-
--magritte-color-text-state-primary-disabled-
|
|
4
|
-
--magritte-color-component-time-picker-background-selection-
|
|
2
|
+
--magritte-color-text-primary-v26-0-1:#000000;
|
|
3
|
+
--magritte-color-text-state-primary-disabled-v26-0-1:#0000007a;
|
|
4
|
+
--magritte-color-component-time-picker-background-selection-v26-0-1:#F1F4F9;
|
|
5
5
|
}
|
|
6
6
|
|
|
7
7
|
.magritte-night-theme{
|
|
8
|
-
--magritte-color-text-primary-
|
|
9
|
-
--magritte-color-text-state-primary-disabled-
|
|
10
|
-
--magritte-color-component-time-picker-background-selection-
|
|
8
|
+
--magritte-color-text-primary-v26-0-1:#ffffff;
|
|
9
|
+
--magritte-color-text-state-primary-disabled-v26-0-1:#ababab7a;
|
|
10
|
+
--magritte-color-component-time-picker-background-selection-v26-0-1:#262626;
|
|
11
11
|
}
|
|
12
|
-
.magritte-picker-wheel___VaPvG_2-1-
|
|
12
|
+
.magritte-picker-wheel___VaPvG_2-1-116{
|
|
13
13
|
position:relative;
|
|
14
14
|
height:100%;
|
|
15
15
|
}
|
|
16
|
-
.magritte-selected-item-background___UnBPm_2-1-
|
|
16
|
+
.magritte-selected-item-background___UnBPm_2-1-116{
|
|
17
17
|
position:absolute;
|
|
18
18
|
inset:calc(50% - 48px / 2) 0;
|
|
19
|
-
background-color:var(--magritte-color-component-time-picker-background-selection-
|
|
19
|
+
background-color:var(--magritte-color-component-time-picker-background-selection-v26-0-1);
|
|
20
20
|
}
|
|
21
|
-
.magritte-columns___I7bCB_2-1-
|
|
21
|
+
.magritte-columns___I7bCB_2-1-116{
|
|
22
22
|
position:relative;
|
|
23
23
|
height:100%;
|
|
24
24
|
display:flex;
|
|
25
25
|
align-items:stretch;
|
|
26
26
|
justify-content:center;
|
|
27
27
|
}
|
|
28
|
-
.magritte-touch-events-overlay___c3YOp_2-1-
|
|
28
|
+
.magritte-touch-events-overlay___c3YOp_2-1-116{
|
|
29
29
|
position:absolute;
|
|
30
30
|
inset:0;
|
|
31
31
|
}
|
|
32
|
-
.magritte-fixed-height___BLw9W_2-1-
|
|
32
|
+
.magritte-fixed-height___BLw9W_2-1-116{
|
|
33
33
|
height:336px;
|
|
34
34
|
}
|
|
35
|
-
.magritte-column-wrapper___yRwai_2-1-
|
|
35
|
+
.magritte-column-wrapper___yRwai_2-1-116{
|
|
36
36
|
flex:0 0 64px;
|
|
37
37
|
position:relative;
|
|
38
38
|
}
|
|
39
|
-
.magritte-column-position-wrapper___wQTIu_2-1-
|
|
39
|
+
.magritte-column-position-wrapper___wQTIu_2-1-116{
|
|
40
40
|
position:relative;
|
|
41
41
|
top:50%;
|
|
42
42
|
margin-top:-24px;
|
|
43
43
|
}
|
|
44
|
-
.magritte-wide-column-wrapper___nvecx_2-1-
|
|
44
|
+
.magritte-wide-column-wrapper___nvecx_2-1-116{
|
|
45
45
|
flex:0 0 105px;
|
|
46
46
|
}
|
|
47
|
-
.magritte-full-width-column-wrapper___oxhh1_2-1-
|
|
47
|
+
.magritte-full-width-column-wrapper___oxhh1_2-1-116{
|
|
48
48
|
flex:0 0 100%;
|
|
49
49
|
}
|
|
50
|
-
.magritte-column___IMYca_2-1-
|
|
50
|
+
.magritte-column___IMYca_2-1-116{
|
|
51
51
|
will-change:transform;
|
|
52
52
|
transform:translate3d(0, 0, 0);
|
|
53
53
|
}
|
|
54
|
-
.magritte-item___4RQVs_2-1-
|
|
54
|
+
.magritte-item___4RQVs_2-1-116{
|
|
55
55
|
font-family:"hh sans";
|
|
56
56
|
font-weight:400;
|
|
57
57
|
line-height:26px;
|
|
@@ -60,25 +60,25 @@
|
|
|
60
60
|
text-indent:0px;
|
|
61
61
|
text-transform:none;
|
|
62
62
|
text-decoration:none;
|
|
63
|
-
color:var(--magritte-color-text-primary-
|
|
63
|
+
color:var(--magritte-color-text-primary-v26-0-1);
|
|
64
64
|
height:18px;
|
|
65
65
|
line-height:18px;
|
|
66
66
|
padding:calc((48px - 18px) / 2) 0;
|
|
67
67
|
text-align:center;
|
|
68
68
|
transform-origin:center center;
|
|
69
69
|
}
|
|
70
|
-
.magritte-item___4RQVs_2-1-
|
|
70
|
+
.magritte-item___4RQVs_2-1-116.magritte-align-left___PXJt0_2-1-116{
|
|
71
71
|
text-align:left;
|
|
72
72
|
transform-origin:left center;
|
|
73
73
|
}
|
|
74
|
-
.magritte-item___4RQVs_2-1-
|
|
74
|
+
.magritte-item___4RQVs_2-1-116.magritte-align-right___0yc2S_2-1-116{
|
|
75
75
|
text-align:right;
|
|
76
76
|
transform-origin:right center;
|
|
77
77
|
}
|
|
78
|
-
.magritte-item___4RQVs_2-1-
|
|
79
|
-
color:var(--magritte-color-text-state-primary-disabled-
|
|
78
|
+
.magritte-item___4RQVs_2-1-116.magritte-disabled___d3ukm_2-1-116{
|
|
79
|
+
color:var(--magritte-color-text-state-primary-disabled-v26-0-1);
|
|
80
80
|
}
|
|
81
|
-
.magritte-item___4RQVs_2-1-
|
|
81
|
+
.magritte-item___4RQVs_2-1-116.magritte-selected___Nar3H_2-1-116{
|
|
82
82
|
font-weight:500;
|
|
83
83
|
height:22px;
|
|
84
84
|
line-height:22px;
|
package/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export * from '
|
|
2
|
-
export * from '
|
|
3
|
-
export { PickerWheel } from '
|
|
4
|
-
export { UncontrolledPickerWheel } from '
|
|
1
|
+
export * from './types';
|
|
2
|
+
export * from './itemsFromRange';
|
|
3
|
+
export { PickerWheel } from './PickerWheel';
|
|
4
|
+
export { UncontrolledPickerWheel } from './UncontrolledPickerWheel';
|
package/itemsFromRange.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { PickerWheelItem } from '
|
|
1
|
+
import { PickerWheelItem } from './types';
|
|
2
2
|
export declare const itemsFromRange: (start: number, end: number, discreteness?: number) => Array<PickerWheelItem>;
|
package/itemsFromRange.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import './index.css';
|
|
2
2
|
const itemsFromRange = (start, end, discreteness = 1) => {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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
8
|
};
|
|
9
9
|
|
|
10
10
|
export { itemsFromRange };
|
package/itemsFromRange.js.map
CHANGED
|
@@ -1 +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,
|
|
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,cAAiB,GAAA,CAAC,KAAe,EAAA,GAAA,EAAa,eAAuB,CAA8B,KAAA;AAC5G,EAAA,MAAM,SAAS,EAAC,CAAA;AAChB,EAAS,KAAA,IAAA,CAAA,GAAI,OAAO,YAAe,GAAA,CAAA,GAAI,KAAK,GAAM,GAAA,CAAA,GAAI,YAAc,EAAA,CAAA,IAAK,YAAc,EAAA;AACnF,IAAA,MAAA,CAAO,KAAK,EAAE,IAAA,EAAM,CAAG,EAAA,CAAC,IAAI,CAAA,CAAA;AAAA,GAChC;AACA,EAAO,OAAA,MAAA,CAAA;AACX;;;;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hh.ru/magritte-ui-picker-wheel",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.116",
|
|
4
4
|
"main": "index.js",
|
|
5
5
|
"types": "index.d.ts",
|
|
6
6
|
"sideEffects": [
|
|
@@ -19,12 +19,12 @@
|
|
|
19
19
|
"watch": "yarn root:watch $(pwd)"
|
|
20
20
|
},
|
|
21
21
|
"dependencies": {
|
|
22
|
-
"@hh.ru/magritte-design-tokens": "
|
|
22
|
+
"@hh.ru/magritte-design-tokens": "26.0.1",
|
|
23
23
|
"@hh.ru/magritte-internal-custom-scroll": "2.1.2",
|
|
24
24
|
"@hh.ru/magritte-types": "5.0.8",
|
|
25
|
-
"@hh.ru/magritte-ui-bottom-sheet": "9.4.
|
|
25
|
+
"@hh.ru/magritte-ui-bottom-sheet": "9.4.49",
|
|
26
26
|
"@hh.ru/magritte-ui-breakpoint": "6.1.2",
|
|
27
|
-
"@hh.ru/magritte-ui-typography": "5.3.
|
|
27
|
+
"@hh.ru/magritte-ui-typography": "5.3.16"
|
|
28
28
|
},
|
|
29
29
|
"peerDependencies": {
|
|
30
30
|
"classnames": ">=2.3.2",
|
|
@@ -33,5 +33,5 @@
|
|
|
33
33
|
"publishConfig": {
|
|
34
34
|
"access": "public"
|
|
35
35
|
},
|
|
36
|
-
"gitHead": "
|
|
36
|
+
"gitHead": "f6539d7a0e7cd42dd851458db1de04a748bbee03"
|
|
37
37
|
}
|