@hh.ru/magritte-internal-drop-base 6.0.3 → 7.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/DropBase.d.ts +194 -7
- package/DropBase.js +9 -29
- package/DropBase.js.map +1 -1
- package/findBestFitPlacement.d.ts +69 -0
- package/findBestFitPlacement.js +270 -0
- package/findBestFitPlacement.js.map +1 -0
- package/index.css +1 -1
- package/index.d.ts +1 -2
- package/index.js +3 -3
- package/intersectionManager.d.ts +2 -1
- package/intersectionManager.js.map +1 -1
- package/package.json +4 -4
- package/positionManager.d.ts +11 -0
- package/positionManager.js +180 -0
- package/positionManager.js.map +1 -0
- package/types.d.ts +36 -173
- package/useMonitorResize.d.ts +18 -0
- package/useMonitorResize.js +56 -0
- package/useMonitorResize.js.map +1 -0
- package/calculateRect.d.ts +0 -18
- package/calculateRect.js +0 -319
- package/calculateRect.js.map +0 -1
- package/scrollManager.d.ts +0 -7
- package/scrollManager.js +0 -131
- package/scrollManager.js.map +0 -1
- package/useRenderParams.d.ts +0 -53
- package/useRenderParams.js +0 -335
- package/useRenderParams.js.map +0 -1
package/calculateRect.js
DELETED
|
@@ -1,319 +0,0 @@
|
|
|
1
|
-
import './index.css';
|
|
2
|
-
const VIEWPORT_GUARD_DISTANCE = 16;
|
|
3
|
-
const getPointToCenterActivator = ({ point, offsetPoint, contentSize, activatorSize, }) => point + offsetPoint - contentSize / 2 + activatorSize / 2;
|
|
4
|
-
/* Позволяет получить метрики drop, позицию относительно viewport
|
|
5
|
-
* для случая, когда дроп может занять всю доступную высоту viewport
|
|
6
|
-
* */
|
|
7
|
-
const calculateDropHeightAvailableViewport = {
|
|
8
|
-
top: ({ leftPositionForDrop, topPositionForViewport, preferredViewportMetrics, topPositionForDrop, dropMetrics, }) => {
|
|
9
|
-
const top = -(topPositionForViewport - preferredViewportMetrics.pageTop - topPositionForDrop) + VIEWPORT_GUARD_DISTANCE;
|
|
10
|
-
const _height = topPositionForViewport + dropMetrics.height - preferredViewportMetrics.pageTop - VIEWPORT_GUARD_DISTANCE;
|
|
11
|
-
const height = _height < dropMetrics.height ? dropMetrics.height : _height;
|
|
12
|
-
const _topPositionForViewport = topPositionForViewport + dropMetrics.height - height;
|
|
13
|
-
return {
|
|
14
|
-
top,
|
|
15
|
-
height,
|
|
16
|
-
left: leftPositionForDrop,
|
|
17
|
-
topPositionForViewport: _topPositionForViewport,
|
|
18
|
-
};
|
|
19
|
-
},
|
|
20
|
-
bottom: ({ leftPositionForDrop, topPositionForViewport, preferredViewportMetrics, topPositionForDrop, dropMetrics, }) => {
|
|
21
|
-
const _height = preferredViewportMetrics.height +
|
|
22
|
-
preferredViewportMetrics.pageTop -
|
|
23
|
-
topPositionForViewport -
|
|
24
|
-
VIEWPORT_GUARD_DISTANCE;
|
|
25
|
-
const height = _height < dropMetrics.height ? dropMetrics.height : _height;
|
|
26
|
-
return {
|
|
27
|
-
top: topPositionForDrop,
|
|
28
|
-
left: leftPositionForDrop,
|
|
29
|
-
height,
|
|
30
|
-
topPositionForViewport,
|
|
31
|
-
};
|
|
32
|
-
},
|
|
33
|
-
};
|
|
34
|
-
/**
|
|
35
|
-
* Позволяет получить метрику top или left дропдауна и viewport или
|
|
36
|
-
* контейнера в котором хотим рисовать дропдаун. Считать нужно
|
|
37
|
-
* для top или left в зависимости от того противоположна ли метрика
|
|
38
|
-
* к direction. Т.е мы считает метрику top только
|
|
39
|
-
* для горизонтального направления, a left для вертикального
|
|
40
|
-
* */
|
|
41
|
-
const getEdgeOppositeDirection = ({ activatorPosition, viewportShift, activatorOffset, shift, isNegativeArrowShift, arrowGuardDistance, activatorSize, }) => {
|
|
42
|
-
let shiftArrow = 0;
|
|
43
|
-
if (arrowGuardDistance && activatorSize / 2 < arrowGuardDistance) {
|
|
44
|
-
shiftArrow = arrowGuardDistance - activatorSize / 2;
|
|
45
|
-
}
|
|
46
|
-
if (isNegativeArrowShift) {
|
|
47
|
-
shiftArrow = -shiftArrow;
|
|
48
|
-
}
|
|
49
|
-
const positionForDrop = shift + activatorOffset + shiftArrow;
|
|
50
|
-
const positionForViewport = shift + activatorPosition + viewportShift + shiftArrow;
|
|
51
|
-
return [positionForDrop, positionForViewport];
|
|
52
|
-
};
|
|
53
|
-
/**
|
|
54
|
-
* Позволяет получить метрику top или left дропдауна и viewport
|
|
55
|
-
* или контейнера в котором хотим рисовать дропдаун. Считать нужно для top
|
|
56
|
-
* или left в зависимости от того совпдает ли метрика с direction.
|
|
57
|
-
* Т.е мы считает метрику top только для вертикального направления, a left
|
|
58
|
-
* для горизонтального направления
|
|
59
|
-
* */
|
|
60
|
-
const getEageCoincidingWithDirection = ({ activatorPosition, activatorSize, dropSize, viewportShift, isNegativePosition, activatorOffset, guardDistance, }) => {
|
|
61
|
-
let positionForViewport = 0;
|
|
62
|
-
let positionForDrop = 0;
|
|
63
|
-
if (isNegativePosition) {
|
|
64
|
-
positionForDrop = activatorOffset - guardDistance - dropSize;
|
|
65
|
-
positionForViewport = activatorPosition + viewportShift - guardDistance - dropSize;
|
|
66
|
-
}
|
|
67
|
-
else {
|
|
68
|
-
positionForDrop = activatorOffset + activatorSize + guardDistance;
|
|
69
|
-
positionForViewport = activatorPosition + viewportShift + activatorSize + guardDistance;
|
|
70
|
-
}
|
|
71
|
-
return [positionForDrop, positionForViewport];
|
|
72
|
-
};
|
|
73
|
-
/**
|
|
74
|
-
* API для расчета метрик дропдауна и viewport | контейнера в котором
|
|
75
|
-
* хотим рисовать дропдаун. Cчитает метрики в случае
|
|
76
|
-
* когда position = Horizontal.
|
|
77
|
-
* Т.е. дропдаун показываем cлева или справа от активатора.
|
|
78
|
-
* Предоставляем три публичных метода для расположения относительно края активатора:
|
|
79
|
-
* top - выравнивание по верхнему краю
|
|
80
|
-
* bottom - выравнивание по нижнему краю
|
|
81
|
-
* center - выравнивание по центру
|
|
82
|
-
* */
|
|
83
|
-
const calculateRectForHorizontalPosition = {
|
|
84
|
-
top({ activatorMetrics, dropMetrics, viewportMetrics, preferredViewportMetrics, direction, activatorOffset, guardDistance, arrowGuardDistance, occupyAllAvailableViewportHeight, }) {
|
|
85
|
-
const result = this._baseAlign({
|
|
86
|
-
activatorMetrics,
|
|
87
|
-
dropMetrics,
|
|
88
|
-
viewportMetrics,
|
|
89
|
-
direction,
|
|
90
|
-
isNegativeArrowShift: true,
|
|
91
|
-
activatorOffset,
|
|
92
|
-
shift: 0,
|
|
93
|
-
arrowGuardDistance,
|
|
94
|
-
guardDistance,
|
|
95
|
-
preferredViewportMetrics,
|
|
96
|
-
});
|
|
97
|
-
if (occupyAllAvailableViewportHeight) {
|
|
98
|
-
const metrics = calculateDropHeightAvailableViewport.bottom({
|
|
99
|
-
preferredViewportMetrics,
|
|
100
|
-
topPositionForViewport: result.top,
|
|
101
|
-
topPositionForDrop: result.dropMetrics.top,
|
|
102
|
-
leftPositionForDrop: result.dropMetrics.left,
|
|
103
|
-
dropMetrics,
|
|
104
|
-
});
|
|
105
|
-
return {
|
|
106
|
-
...result,
|
|
107
|
-
top: metrics.topPositionForViewport,
|
|
108
|
-
bottom: metrics.topPositionForViewport + metrics.height,
|
|
109
|
-
dropMetrics: {
|
|
110
|
-
top: metrics.top,
|
|
111
|
-
left: metrics.left,
|
|
112
|
-
height: metrics.height,
|
|
113
|
-
},
|
|
114
|
-
};
|
|
115
|
-
}
|
|
116
|
-
return result;
|
|
117
|
-
},
|
|
118
|
-
bottom({ activatorMetrics, dropMetrics, viewportMetrics, direction, activatorOffset, guardDistance, arrowGuardDistance, occupyAllAvailableViewportHeight, preferredViewportMetrics, }) {
|
|
119
|
-
const shift = dropMetrics.height - activatorMetrics.height;
|
|
120
|
-
const result = this._baseAlign({
|
|
121
|
-
activatorMetrics,
|
|
122
|
-
dropMetrics,
|
|
123
|
-
viewportMetrics,
|
|
124
|
-
direction,
|
|
125
|
-
activatorOffset,
|
|
126
|
-
shift: -shift,
|
|
127
|
-
arrowGuardDistance,
|
|
128
|
-
guardDistance,
|
|
129
|
-
preferredViewportMetrics,
|
|
130
|
-
});
|
|
131
|
-
if (occupyAllAvailableViewportHeight) {
|
|
132
|
-
const metrics = calculateDropHeightAvailableViewport.top({
|
|
133
|
-
preferredViewportMetrics,
|
|
134
|
-
topPositionForViewport: result.top,
|
|
135
|
-
topPositionForDrop: result.dropMetrics.top,
|
|
136
|
-
leftPositionForDrop: result.dropMetrics.left,
|
|
137
|
-
dropMetrics,
|
|
138
|
-
});
|
|
139
|
-
return {
|
|
140
|
-
top: metrics.topPositionForViewport,
|
|
141
|
-
left: result.left,
|
|
142
|
-
bottom: activatorMetrics.bottom,
|
|
143
|
-
right: result.right,
|
|
144
|
-
viewportMetrics,
|
|
145
|
-
dropMetrics: {
|
|
146
|
-
top: metrics.top,
|
|
147
|
-
left: metrics.left,
|
|
148
|
-
height: metrics.height,
|
|
149
|
-
},
|
|
150
|
-
};
|
|
151
|
-
}
|
|
152
|
-
return result;
|
|
153
|
-
},
|
|
154
|
-
center({ activatorMetrics, dropMetrics, viewportMetrics, direction, activatorOffset, guardDistance, preferredViewportMetrics, }) {
|
|
155
|
-
const pointToCenterActivator = getPointToCenterActivator({
|
|
156
|
-
point: 0,
|
|
157
|
-
offsetPoint: 0,
|
|
158
|
-
contentSize: dropMetrics.height,
|
|
159
|
-
activatorSize: activatorMetrics.height,
|
|
160
|
-
});
|
|
161
|
-
return this._baseAlign({
|
|
162
|
-
activatorMetrics,
|
|
163
|
-
dropMetrics,
|
|
164
|
-
viewportMetrics,
|
|
165
|
-
direction,
|
|
166
|
-
activatorOffset,
|
|
167
|
-
shift: pointToCenterActivator,
|
|
168
|
-
guardDistance,
|
|
169
|
-
preferredViewportMetrics,
|
|
170
|
-
});
|
|
171
|
-
},
|
|
172
|
-
_baseAlign({ activatorMetrics, dropMetrics, viewportMetrics, direction, activatorOffset, shift, arrowGuardDistance, isNegativeArrowShift = false, guardDistance, }) {
|
|
173
|
-
const [leftPositionForDrop, leftPositionForViewport] = getEageCoincidingWithDirection({
|
|
174
|
-
activatorPosition: activatorMetrics.left,
|
|
175
|
-
activatorSize: activatorMetrics.width,
|
|
176
|
-
dropSize: dropMetrics.width,
|
|
177
|
-
viewportShift: viewportMetrics.pageLeft,
|
|
178
|
-
isNegativePosition: direction === 'left',
|
|
179
|
-
activatorOffset: activatorOffset.offsetLeft,
|
|
180
|
-
guardDistance,
|
|
181
|
-
});
|
|
182
|
-
const [topPositionForDrop, topPositionForViewport] = getEdgeOppositeDirection({
|
|
183
|
-
activatorPosition: activatorMetrics.top,
|
|
184
|
-
viewportShift: viewportMetrics.pageTop,
|
|
185
|
-
activatorOffset: activatorOffset.offsetTop,
|
|
186
|
-
isNegativeArrowShift,
|
|
187
|
-
shift,
|
|
188
|
-
arrowGuardDistance,
|
|
189
|
-
activatorSize: activatorMetrics.height,
|
|
190
|
-
});
|
|
191
|
-
return {
|
|
192
|
-
top: topPositionForViewport,
|
|
193
|
-
left: leftPositionForViewport,
|
|
194
|
-
bottom: topPositionForViewport + dropMetrics.height,
|
|
195
|
-
right: leftPositionForViewport + dropMetrics.width,
|
|
196
|
-
dropMetrics: {
|
|
197
|
-
top: topPositionForDrop,
|
|
198
|
-
left: leftPositionForDrop,
|
|
199
|
-
height: 'auto',
|
|
200
|
-
},
|
|
201
|
-
viewportMetrics,
|
|
202
|
-
};
|
|
203
|
-
},
|
|
204
|
-
};
|
|
205
|
-
/**
|
|
206
|
-
* API для расчета метрик дропдауна и viewport | контейнера в котором
|
|
207
|
-
* хотим рисовать дропдаун. Cчитает метрики в случае - когда direction = VerticalPosition.
|
|
208
|
-
* Т.е. дропдаун показываем снизу или сверху активатора.
|
|
209
|
-
* Предоставляем три публичных метода для расположения относительно края активатора:
|
|
210
|
-
* left - выравнивание по левому краю
|
|
211
|
-
* right - выравнивание по правому краю
|
|
212
|
-
* center - выравнивание по центру
|
|
213
|
-
* */
|
|
214
|
-
const calculateRectForVerticalPosition = {
|
|
215
|
-
left({ activatorMetrics, dropMetrics, viewportMetrics, direction, activatorOffset, guardDistance, arrowGuardDistance, occupyAllAvailableViewportHeight, preferredViewportMetrics, }) {
|
|
216
|
-
return this._baseAlign({
|
|
217
|
-
activatorMetrics,
|
|
218
|
-
dropMetrics,
|
|
219
|
-
viewportMetrics,
|
|
220
|
-
direction,
|
|
221
|
-
activatorOffset,
|
|
222
|
-
shift: 0,
|
|
223
|
-
isNegativeArrowShift: true,
|
|
224
|
-
guardDistance,
|
|
225
|
-
arrowGuardDistance,
|
|
226
|
-
occupyAllAvailableViewportHeight,
|
|
227
|
-
preferredViewportMetrics,
|
|
228
|
-
});
|
|
229
|
-
},
|
|
230
|
-
right({ activatorMetrics, dropMetrics, viewportMetrics, direction, activatorOffset, guardDistance, arrowGuardDistance, occupyAllAvailableViewportHeight, preferredViewportMetrics, }) {
|
|
231
|
-
return this._baseAlign({
|
|
232
|
-
activatorMetrics,
|
|
233
|
-
dropMetrics,
|
|
234
|
-
viewportMetrics,
|
|
235
|
-
direction,
|
|
236
|
-
activatorOffset,
|
|
237
|
-
shift: -(dropMetrics.width - activatorMetrics.width),
|
|
238
|
-
arrowGuardDistance,
|
|
239
|
-
guardDistance,
|
|
240
|
-
occupyAllAvailableViewportHeight,
|
|
241
|
-
preferredViewportMetrics,
|
|
242
|
-
});
|
|
243
|
-
},
|
|
244
|
-
center({ activatorMetrics, dropMetrics, viewportMetrics, direction, activatorOffset, guardDistance, occupyAllAvailableViewportHeight, preferredViewportMetrics, }) {
|
|
245
|
-
const pointToCenterActivator = getPointToCenterActivator({
|
|
246
|
-
point: 0,
|
|
247
|
-
offsetPoint: 0,
|
|
248
|
-
contentSize: dropMetrics.width,
|
|
249
|
-
activatorSize: activatorMetrics.width,
|
|
250
|
-
});
|
|
251
|
-
return this._baseAlign({
|
|
252
|
-
activatorMetrics,
|
|
253
|
-
dropMetrics,
|
|
254
|
-
viewportMetrics,
|
|
255
|
-
direction,
|
|
256
|
-
activatorOffset,
|
|
257
|
-
shift: pointToCenterActivator,
|
|
258
|
-
guardDistance,
|
|
259
|
-
occupyAllAvailableViewportHeight,
|
|
260
|
-
preferredViewportMetrics,
|
|
261
|
-
});
|
|
262
|
-
},
|
|
263
|
-
_baseAlign({ activatorMetrics, dropMetrics, viewportMetrics, direction, activatorOffset, shift, arrowGuardDistance, isNegativeArrowShift = false, guardDistance, occupyAllAvailableViewportHeight, preferredViewportMetrics, }) {
|
|
264
|
-
const [topPositionForDrop, topPositionForViewport] = getEageCoincidingWithDirection({
|
|
265
|
-
activatorPosition: activatorMetrics.top,
|
|
266
|
-
activatorSize: activatorMetrics.height,
|
|
267
|
-
dropSize: dropMetrics.height,
|
|
268
|
-
viewportShift: viewportMetrics.pageTop,
|
|
269
|
-
isNegativePosition: direction !== 'bottom',
|
|
270
|
-
activatorOffset: activatorOffset.offsetTop,
|
|
271
|
-
guardDistance,
|
|
272
|
-
});
|
|
273
|
-
const [leftPositionForDrop, leftPositionForViewport] = getEdgeOppositeDirection({
|
|
274
|
-
activatorPosition: activatorMetrics.left,
|
|
275
|
-
viewportShift: viewportMetrics.pageLeft,
|
|
276
|
-
activatorOffset: activatorOffset.offsetLeft,
|
|
277
|
-
shift,
|
|
278
|
-
isNegativeArrowShift,
|
|
279
|
-
arrowGuardDistance,
|
|
280
|
-
activatorSize: activatorMetrics.width,
|
|
281
|
-
});
|
|
282
|
-
let metrics = {
|
|
283
|
-
topPositionForViewport,
|
|
284
|
-
top: topPositionForDrop,
|
|
285
|
-
left: leftPositionForDrop,
|
|
286
|
-
height: 0,
|
|
287
|
-
};
|
|
288
|
-
if (occupyAllAvailableViewportHeight) {
|
|
289
|
-
metrics = calculateDropHeightAvailableViewport[direction]({
|
|
290
|
-
topPositionForViewport,
|
|
291
|
-
preferredViewportMetrics,
|
|
292
|
-
topPositionForDrop,
|
|
293
|
-
dropMetrics,
|
|
294
|
-
leftPositionForDrop,
|
|
295
|
-
});
|
|
296
|
-
}
|
|
297
|
-
return {
|
|
298
|
-
top: metrics.topPositionForViewport,
|
|
299
|
-
left: leftPositionForViewport,
|
|
300
|
-
bottom: metrics.topPositionForViewport + (metrics.height !== 0 ? metrics.height : dropMetrics.height),
|
|
301
|
-
right: leftPositionForViewport + dropMetrics.width,
|
|
302
|
-
dropMetrics: {
|
|
303
|
-
top: metrics.top,
|
|
304
|
-
left: metrics.left,
|
|
305
|
-
height: metrics.height !== 0 ? metrics.height : 'auto',
|
|
306
|
-
},
|
|
307
|
-
viewportMetrics,
|
|
308
|
-
};
|
|
309
|
-
},
|
|
310
|
-
};
|
|
311
|
-
const calculateRect = {
|
|
312
|
-
left: calculateRectForHorizontalPosition,
|
|
313
|
-
right: calculateRectForHorizontalPosition,
|
|
314
|
-
top: calculateRectForVerticalPosition,
|
|
315
|
-
bottom: calculateRectForVerticalPosition,
|
|
316
|
-
};
|
|
317
|
-
|
|
318
|
-
export { VIEWPORT_GUARD_DISTANCE, calculateRect, calculateRectForVerticalPosition };
|
|
319
|
-
//# sourceMappingURL=calculateRect.js.map
|
package/calculateRect.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"calculateRect.js","sources":["../src/calculateRect.ts"],"sourcesContent":["import {\n BaseAlignPosition,\n GetEageCoincidingWithDirectionArgs,\n GetEdgeOppositeDirectionArgs,\n GetPointToCenterActivator,\n CalculateRect,\n CalculateRectType,\n CalculateDropHeightAvailableViewportArgs,\n CalculateDropHeightAvailableViewportResult,\n DropBaseHorizontalPosition,\n DropBaseVerticalPosition,\n} from '@hh.ru/magritte-internal-drop-base/types';\n\nexport const VIEWPORT_GUARD_DISTANCE = 16;\n\nconst getPointToCenterActivator = ({\n point,\n offsetPoint,\n contentSize,\n activatorSize,\n}: GetPointToCenterActivator): number => point + offsetPoint - contentSize / 2 + activatorSize / 2;\n\n/* Позволяет получить метрики drop, позицию относительно viewport\n * для случая, когда дроп может занять всю доступную высоту viewport\n * */\nconst calculateDropHeightAvailableViewport: {\n top: CalculateDropHeightAvailableViewportArgs;\n bottom: CalculateDropHeightAvailableViewportArgs;\n} = {\n top: ({\n leftPositionForDrop,\n topPositionForViewport,\n preferredViewportMetrics,\n topPositionForDrop,\n dropMetrics,\n }) => {\n const top =\n -(topPositionForViewport - preferredViewportMetrics.pageTop - topPositionForDrop) + VIEWPORT_GUARD_DISTANCE;\n const _height =\n topPositionForViewport + dropMetrics.height - preferredViewportMetrics.pageTop - VIEWPORT_GUARD_DISTANCE;\n const height = _height < dropMetrics.height ? dropMetrics.height : _height;\n const _topPositionForViewport = topPositionForViewport + dropMetrics.height - height;\n\n return {\n top,\n height,\n left: leftPositionForDrop,\n topPositionForViewport: _topPositionForViewport,\n };\n },\n\n bottom: ({\n leftPositionForDrop,\n topPositionForViewport,\n preferredViewportMetrics,\n topPositionForDrop,\n dropMetrics,\n }) => {\n const _height =\n preferredViewportMetrics.height +\n preferredViewportMetrics.pageTop -\n topPositionForViewport -\n VIEWPORT_GUARD_DISTANCE;\n const height = _height < dropMetrics.height ? dropMetrics.height : _height;\n\n return {\n top: topPositionForDrop,\n left: leftPositionForDrop,\n height,\n topPositionForViewport,\n };\n },\n};\n\n/**\n * Позволяет получить метрику top или left дропдауна и viewport или\n * контейнера в котором хотим рисовать дропдаун. Считать нужно\n * для top или left в зависимости от того противоположна ли метрика\n * к direction. Т.е мы считает метрику top только\n * для горизонтального направления, a left для вертикального\n * */\nconst getEdgeOppositeDirection = ({\n activatorPosition,\n viewportShift,\n activatorOffset,\n shift,\n isNegativeArrowShift,\n arrowGuardDistance,\n activatorSize,\n}: GetEdgeOppositeDirectionArgs): [number, number] => {\n let shiftArrow = 0;\n\n if (arrowGuardDistance && activatorSize / 2 < arrowGuardDistance) {\n shiftArrow = arrowGuardDistance - activatorSize / 2;\n }\n\n if (isNegativeArrowShift) {\n shiftArrow = -shiftArrow;\n }\n\n const positionForDrop = shift + activatorOffset + shiftArrow;\n const positionForViewport = shift + activatorPosition + viewportShift + shiftArrow;\n\n return [positionForDrop, positionForViewport];\n};\n\n/**\n * Позволяет получить метрику top или left дропдауна и viewport\n * или контейнера в котором хотим рисовать дропдаун. Считать нужно для top\n * или left в зависимости от того совпдает ли метрика с direction.\n * Т.е мы считает метрику top только для вертикального направления, a left\n * для горизонтального направления\n * */\nconst getEageCoincidingWithDirection = ({\n activatorPosition,\n activatorSize,\n dropSize,\n viewportShift,\n isNegativePosition,\n activatorOffset,\n guardDistance,\n}: GetEageCoincidingWithDirectionArgs): [number, number] => {\n let positionForViewport = 0;\n let positionForDrop = 0;\n\n if (isNegativePosition) {\n positionForDrop = activatorOffset - guardDistance - dropSize;\n positionForViewport = activatorPosition + viewportShift - guardDistance - dropSize;\n } else {\n positionForDrop = activatorOffset + activatorSize + guardDistance;\n positionForViewport = activatorPosition + viewportShift + activatorSize + guardDistance;\n }\n\n return [positionForDrop, positionForViewport];\n};\n\n/**\n * API для расчета метрик дропдауна и viewport | контейнера в котором\n * хотим рисовать дропдаун. Cчитает метрики в случае\n * когда position = Horizontal.\n * Т.е. дропдаун показываем cлева или справа от активатора.\n * Предоставляем три публичных метода для расположения относительно края активатора:\n * top - выравнивание по верхнему краю\n * bottom - выравнивание по нижнему краю\n * center - выравнивание по центру\n * */\nconst calculateRectForHorizontalPosition: {\n top: CalculateRect<DropBaseHorizontalPosition['direction']>;\n bottom: CalculateRect<DropBaseHorizontalPosition['direction']>;\n center: CalculateRect<DropBaseHorizontalPosition['direction']>;\n _baseAlign: BaseAlignPosition<DropBaseHorizontalPosition['direction']>;\n} = {\n top({\n activatorMetrics,\n dropMetrics,\n viewportMetrics,\n preferredViewportMetrics,\n direction,\n activatorOffset,\n guardDistance,\n arrowGuardDistance,\n occupyAllAvailableViewportHeight,\n }) {\n const result = this._baseAlign({\n activatorMetrics,\n dropMetrics,\n viewportMetrics,\n direction,\n isNegativeArrowShift: true,\n activatorOffset,\n shift: 0,\n arrowGuardDistance,\n guardDistance,\n preferredViewportMetrics,\n });\n\n if (occupyAllAvailableViewportHeight) {\n const metrics = calculateDropHeightAvailableViewport.bottom({\n preferredViewportMetrics,\n topPositionForViewport: result.top,\n topPositionForDrop: result.dropMetrics.top,\n leftPositionForDrop: result.dropMetrics.left,\n dropMetrics,\n });\n\n return {\n ...result,\n top: metrics.topPositionForViewport,\n bottom: metrics.topPositionForViewport + metrics.height,\n dropMetrics: {\n top: metrics.top,\n left: metrics.left,\n height: metrics.height,\n },\n };\n }\n\n return result;\n },\n bottom({\n activatorMetrics,\n dropMetrics,\n viewportMetrics,\n direction,\n activatorOffset,\n guardDistance,\n arrowGuardDistance,\n occupyAllAvailableViewportHeight,\n preferredViewportMetrics,\n }) {\n const shift = dropMetrics.height - activatorMetrics.height;\n const result = this._baseAlign({\n activatorMetrics,\n dropMetrics,\n viewportMetrics,\n direction,\n activatorOffset,\n shift: -shift,\n arrowGuardDistance,\n guardDistance,\n preferredViewportMetrics,\n });\n\n if (occupyAllAvailableViewportHeight) {\n const metrics = calculateDropHeightAvailableViewport.top({\n preferredViewportMetrics,\n topPositionForViewport: result.top,\n topPositionForDrop: result.dropMetrics.top,\n leftPositionForDrop: result.dropMetrics.left,\n dropMetrics,\n });\n\n return {\n top: metrics.topPositionForViewport,\n left: result.left,\n bottom: activatorMetrics.bottom,\n right: result.right,\n viewportMetrics,\n dropMetrics: {\n top: metrics.top,\n left: metrics.left,\n height: metrics.height,\n },\n };\n }\n\n return result;\n },\n center({\n activatorMetrics,\n dropMetrics,\n viewportMetrics,\n direction,\n activatorOffset,\n guardDistance,\n preferredViewportMetrics,\n }) {\n const pointToCenterActivator = getPointToCenterActivator({\n point: 0,\n offsetPoint: 0,\n contentSize: dropMetrics.height,\n activatorSize: activatorMetrics.height,\n });\n\n return this._baseAlign({\n activatorMetrics,\n dropMetrics,\n viewportMetrics,\n direction,\n activatorOffset,\n shift: pointToCenterActivator,\n guardDistance,\n preferredViewportMetrics,\n });\n },\n _baseAlign({\n activatorMetrics,\n dropMetrics,\n viewportMetrics,\n direction,\n activatorOffset,\n shift,\n arrowGuardDistance,\n isNegativeArrowShift = false,\n guardDistance,\n }) {\n const [leftPositionForDrop, leftPositionForViewport] = getEageCoincidingWithDirection({\n activatorPosition: activatorMetrics.left,\n activatorSize: activatorMetrics.width,\n dropSize: dropMetrics.width,\n viewportShift: viewportMetrics.pageLeft,\n isNegativePosition: direction === 'left',\n activatorOffset: activatorOffset.offsetLeft,\n guardDistance,\n });\n\n const [topPositionForDrop, topPositionForViewport] = getEdgeOppositeDirection({\n activatorPosition: activatorMetrics.top,\n viewportShift: viewportMetrics.pageTop,\n activatorOffset: activatorOffset.offsetTop,\n isNegativeArrowShift,\n shift,\n arrowGuardDistance,\n activatorSize: activatorMetrics.height,\n });\n\n return {\n top: topPositionForViewport,\n left: leftPositionForViewport,\n bottom: topPositionForViewport + dropMetrics.height,\n right: leftPositionForViewport + dropMetrics.width,\n dropMetrics: {\n top: topPositionForDrop,\n left: leftPositionForDrop,\n height: 'auto',\n },\n viewportMetrics,\n };\n },\n};\n\n/**\n * API для расчета метрик дропдауна и viewport | контейнера в котором\n * хотим рисовать дропдаун. Cчитает метрики в случае - когда direction = VerticalPosition.\n * Т.е. дропдаун показываем снизу или сверху активатора.\n * Предоставляем три публичных метода для расположения относительно края активатора:\n * left - выравнивание по левому краю\n * right - выравнивание по правому краю\n * center - выравнивание по центру\n * */\nexport const calculateRectForVerticalPosition: {\n left: CalculateRect<DropBaseVerticalPosition['direction']>;\n right: CalculateRect<DropBaseVerticalPosition['direction']>;\n center: CalculateRect<DropBaseVerticalPosition['direction']>;\n _baseAlign: BaseAlignPosition<DropBaseVerticalPosition['direction']>;\n} = {\n left({\n activatorMetrics,\n dropMetrics,\n viewportMetrics,\n direction,\n activatorOffset,\n guardDistance,\n arrowGuardDistance,\n occupyAllAvailableViewportHeight,\n preferredViewportMetrics,\n }) {\n return this._baseAlign({\n activatorMetrics,\n dropMetrics,\n viewportMetrics,\n direction,\n activatorOffset,\n shift: 0,\n isNegativeArrowShift: true,\n guardDistance,\n arrowGuardDistance,\n occupyAllAvailableViewportHeight,\n preferredViewportMetrics,\n });\n },\n right({\n activatorMetrics,\n dropMetrics,\n viewportMetrics,\n direction,\n activatorOffset,\n guardDistance,\n arrowGuardDistance,\n occupyAllAvailableViewportHeight,\n preferredViewportMetrics,\n }) {\n return this._baseAlign({\n activatorMetrics,\n dropMetrics,\n viewportMetrics,\n direction,\n activatorOffset,\n shift: -(dropMetrics.width - activatorMetrics.width),\n arrowGuardDistance,\n guardDistance,\n occupyAllAvailableViewportHeight,\n preferredViewportMetrics,\n });\n },\n center({\n activatorMetrics,\n dropMetrics,\n viewportMetrics,\n direction,\n activatorOffset,\n guardDistance,\n occupyAllAvailableViewportHeight,\n preferredViewportMetrics,\n }) {\n const pointToCenterActivator = getPointToCenterActivator({\n point: 0,\n offsetPoint: 0,\n contentSize: dropMetrics.width,\n activatorSize: activatorMetrics.width,\n });\n\n return this._baseAlign({\n activatorMetrics,\n dropMetrics,\n viewportMetrics,\n direction,\n activatorOffset,\n shift: pointToCenterActivator,\n guardDistance,\n occupyAllAvailableViewportHeight,\n preferredViewportMetrics,\n });\n },\n _baseAlign({\n activatorMetrics,\n dropMetrics,\n viewportMetrics,\n direction,\n activatorOffset,\n shift,\n arrowGuardDistance,\n isNegativeArrowShift = false,\n guardDistance,\n occupyAllAvailableViewportHeight,\n preferredViewportMetrics,\n }) {\n const [topPositionForDrop, topPositionForViewport] = getEageCoincidingWithDirection({\n activatorPosition: activatorMetrics.top,\n activatorSize: activatorMetrics.height,\n dropSize: dropMetrics.height,\n viewportShift: viewportMetrics.pageTop,\n isNegativePosition: direction !== 'bottom',\n activatorOffset: activatorOffset.offsetTop,\n guardDistance,\n });\n\n const [leftPositionForDrop, leftPositionForViewport] = getEdgeOppositeDirection({\n activatorPosition: activatorMetrics.left,\n viewportShift: viewportMetrics.pageLeft,\n activatorOffset: activatorOffset.offsetLeft,\n shift,\n isNegativeArrowShift,\n arrowGuardDistance,\n activatorSize: activatorMetrics.width,\n });\n\n let metrics: CalculateDropHeightAvailableViewportResult = {\n topPositionForViewport,\n top: topPositionForDrop,\n left: leftPositionForDrop,\n height: 0,\n };\n\n if (occupyAllAvailableViewportHeight) {\n metrics = calculateDropHeightAvailableViewport[direction]({\n topPositionForViewport,\n preferredViewportMetrics,\n topPositionForDrop,\n dropMetrics,\n leftPositionForDrop,\n });\n }\n\n return {\n top: metrics.topPositionForViewport,\n left: leftPositionForViewport,\n bottom: metrics.topPositionForViewport + (metrics.height !== 0 ? metrics.height : dropMetrics.height),\n right: leftPositionForViewport + dropMetrics.width,\n dropMetrics: {\n top: metrics.top,\n left: metrics.left,\n height: metrics.height !== 0 ? metrics.height : 'auto',\n },\n viewportMetrics,\n };\n },\n};\n\nexport const calculateRect: CalculateRectType<DropBaseHorizontalPosition> &\n CalculateRectType<DropBaseVerticalPosition> = {\n left: calculateRectForHorizontalPosition,\n right: calculateRectForHorizontalPosition,\n top: calculateRectForVerticalPosition,\n bottom: calculateRectForVerticalPosition,\n};\n"],"names":[],"mappings":"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"}
|
package/scrollManager.d.ts
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import { RefObject } from 'react';
|
|
2
|
-
interface SubscriptionCallback {
|
|
3
|
-
(target: HTMLElement, deltaX: number, deltaY: number): void;
|
|
4
|
-
}
|
|
5
|
-
export declare const deleteScrollSubscription: (callback: SubscriptionCallback) => void;
|
|
6
|
-
export declare const useScrollSubscription: (activatorRef: RefObject<HTMLElement>, dropRef: RefObject<HTMLElement>, isVisible: boolean) => void;
|
|
7
|
-
export {};
|
package/scrollManager.js
DELETED
|
@@ -1,131 +0,0 @@
|
|
|
1
|
-
import './index.css';
|
|
2
|
-
import { useRef, useCallback, useEffect } from 'react';
|
|
3
|
-
import { requestAnimation } from '@hh.ru/magritte-common-func-utils';
|
|
4
|
-
|
|
5
|
-
let isInitialized = false;
|
|
6
|
-
const scrollSubscriptions = [];
|
|
7
|
-
const canceledScrollSubscriptions = new Map();
|
|
8
|
-
const lastScrollPosition = new Map();
|
|
9
|
-
const scrollHandler = (event) => {
|
|
10
|
-
const target = event.target;
|
|
11
|
-
if (!target) {
|
|
12
|
-
return;
|
|
13
|
-
}
|
|
14
|
-
const lastPosition = lastScrollPosition.get(target) || null;
|
|
15
|
-
if (lastPosition === null) {
|
|
16
|
-
// если мы не знаем предыдущую позицию для данного скроллящегося контейнера, то мы не сможем посчитать дельту
|
|
17
|
-
// поэтому просто запоминаем текущую позицию и предотвращаем дальнейший обработку события
|
|
18
|
-
lastScrollPosition.set(target, { x: target.scrollLeft, y: target.scrollTop });
|
|
19
|
-
event.preventDefault();
|
|
20
|
-
event.stopPropagation();
|
|
21
|
-
return;
|
|
22
|
-
}
|
|
23
|
-
// обращения к scrollLeft и scrollTop вызывают рефлоу, поэтому кешируем их значения
|
|
24
|
-
const scrollValues = { scrollLeft: target.scrollLeft, scrollTop: target.scrollTop };
|
|
25
|
-
const scrollDelta = {
|
|
26
|
-
x: scrollValues.scrollLeft - lastPosition.x,
|
|
27
|
-
y: scrollValues.scrollTop - lastPosition.y,
|
|
28
|
-
};
|
|
29
|
-
lastScrollPosition.set(target, { x: scrollValues.scrollLeft, y: scrollValues.scrollTop });
|
|
30
|
-
if (scrollSubscriptions.length === 0) {
|
|
31
|
-
return;
|
|
32
|
-
}
|
|
33
|
-
const canceledSubscriptions = canceledScrollSubscriptions.get(target);
|
|
34
|
-
const subscriptions = canceledSubscriptions === undefined
|
|
35
|
-
? scrollSubscriptions
|
|
36
|
-
: scrollSubscriptions.filter((subscription) => !canceledSubscriptions.includes(subscription));
|
|
37
|
-
subscriptions.forEach((subscription) => subscription(target, scrollDelta.x, scrollDelta.y));
|
|
38
|
-
};
|
|
39
|
-
const initialize = () => {
|
|
40
|
-
if (isInitialized) {
|
|
41
|
-
return;
|
|
42
|
-
}
|
|
43
|
-
isInitialized = true;
|
|
44
|
-
document.addEventListener('scroll', scrollHandler, { capture: true, passive: false });
|
|
45
|
-
};
|
|
46
|
-
const suspendSubscription = (callback) => {
|
|
47
|
-
const index = scrollSubscriptions.indexOf(callback);
|
|
48
|
-
if (index !== -1) {
|
|
49
|
-
scrollSubscriptions.splice(index, 1);
|
|
50
|
-
}
|
|
51
|
-
};
|
|
52
|
-
const reviveSubscription = (callback) => {
|
|
53
|
-
initialize();
|
|
54
|
-
scrollSubscriptions.push(callback);
|
|
55
|
-
};
|
|
56
|
-
const deleteScrollSubscription = (callback) => {
|
|
57
|
-
const index = scrollSubscriptions.indexOf(callback);
|
|
58
|
-
if (index !== -1) {
|
|
59
|
-
scrollSubscriptions.splice(index, 1);
|
|
60
|
-
}
|
|
61
|
-
for (const [key, callbacks] of canceledScrollSubscriptions.entries()) {
|
|
62
|
-
const index = callbacks.indexOf(callback);
|
|
63
|
-
if (index !== -1) {
|
|
64
|
-
canceledScrollSubscriptions.set(key, callbacks.splice(index, 1));
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
};
|
|
68
|
-
const unsubscribeFromTarget = (target, callback) => {
|
|
69
|
-
if (!canceledScrollSubscriptions.has(target)) {
|
|
70
|
-
canceledScrollSubscriptions.set(target, []);
|
|
71
|
-
}
|
|
72
|
-
canceledScrollSubscriptions.get(target)?.push(callback);
|
|
73
|
-
};
|
|
74
|
-
const updateDropTranslation = requestAnimation((_, params) => {
|
|
75
|
-
const { dropRef, deltaX, deltaY, currentTranslationRef } = params;
|
|
76
|
-
if (!dropRef.current) {
|
|
77
|
-
return;
|
|
78
|
-
}
|
|
79
|
-
currentTranslationRef.current.x -= deltaX;
|
|
80
|
-
currentTranslationRef.current.y -= deltaY;
|
|
81
|
-
dropRef.current.style.transform = `translate3d(${currentTranslationRef.current.x}px, ${currentTranslationRef.current.y}px, 0)`;
|
|
82
|
-
});
|
|
83
|
-
const useScrollSubscription = (activatorRef, dropRef, isVisible) => {
|
|
84
|
-
/**
|
|
85
|
-
* список id скроллящихся элементов для которых была выполнена проверка
|
|
86
|
-
* влияет ли их скролл на взаимное положение активатора и дропа
|
|
87
|
-
*/
|
|
88
|
-
const processedScrollContainers = useRef(new Set());
|
|
89
|
-
/**
|
|
90
|
-
* текущее значение трансформации дропа
|
|
91
|
-
* при каждом ререндере сбрасывается, т.к. дроп при каждом ререндере пересчитывает свою позицию
|
|
92
|
-
*/
|
|
93
|
-
const currentTranslationRef = useRef({ x: 0, y: 0 });
|
|
94
|
-
currentTranslationRef.current = { x: 0, y: 0 };
|
|
95
|
-
/**
|
|
96
|
-
* ссылка на последнее значение расстояния между активатором и дропом,
|
|
97
|
-
* используется для определения изменения взаимного положения активатора и дропа
|
|
98
|
-
*/
|
|
99
|
-
const visibleRef = useRef(isVisible);
|
|
100
|
-
visibleRef.current = isVisible;
|
|
101
|
-
const scrollCallback = useCallback((target, deltaX, deltaY) => {
|
|
102
|
-
if (!visibleRef.current || !dropRef.current || !activatorRef.current) {
|
|
103
|
-
return;
|
|
104
|
-
}
|
|
105
|
-
// Если это первый скролл данного контейнера, то проверяем содержит ли он активатор и дроп
|
|
106
|
-
// Если он содержит только что-то одно, значит его скролл будет влиять на взаимное расположение дропа
|
|
107
|
-
// и активатора, в этом случае помечяем его как обработанный и меняем позицию дропа при его скролле.
|
|
108
|
-
// Если же он не влияет на взаимное расположение дропа и активатора, то отписываемся от дальнейших
|
|
109
|
-
// оповещений о его скролле.
|
|
110
|
-
if (!processedScrollContainers.current.has(target)) {
|
|
111
|
-
const targetContainsActivator = target.contains(activatorRef.current);
|
|
112
|
-
const targetContainsDrop = target.contains(dropRef.current);
|
|
113
|
-
if (targetContainsActivator === targetContainsDrop) {
|
|
114
|
-
unsubscribeFromTarget(target, scrollCallback);
|
|
115
|
-
return;
|
|
116
|
-
}
|
|
117
|
-
processedScrollContainers.current.add(target);
|
|
118
|
-
}
|
|
119
|
-
updateDropTranslation({ deltaX, deltaY, dropRef, currentTranslationRef });
|
|
120
|
-
}, [activatorRef, dropRef]);
|
|
121
|
-
useEffect(() => {
|
|
122
|
-
// eslint-disable-next-line no-unused-expressions
|
|
123
|
-
isVisible ? reviveSubscription(scrollCallback) : suspendSubscription(scrollCallback);
|
|
124
|
-
}, [isVisible, scrollCallback]);
|
|
125
|
-
useEffect(() => {
|
|
126
|
-
return () => deleteScrollSubscription(scrollCallback);
|
|
127
|
-
}, [scrollCallback]);
|
|
128
|
-
};
|
|
129
|
-
|
|
130
|
-
export { deleteScrollSubscription, useScrollSubscription };
|
|
131
|
-
//# sourceMappingURL=scrollManager.js.map
|
package/scrollManager.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scrollManager.js","sources":["../src/scrollManager.ts"],"sourcesContent":["import { MutableRefObject, RefObject, useCallback, useEffect, useRef } from 'react';\n\nimport { requestAnimation } from '@hh.ru/magritte-common-func-utils';\n\nlet isInitialized = false;\n\ninterface SubscriptionCallback {\n (target: HTMLElement, deltaX: number, deltaY: number): void;\n}\n\nconst scrollSubscriptions: Array<SubscriptionCallback> = [];\nconst canceledScrollSubscriptions: Map<HTMLElement, Array<SubscriptionCallback>> = new Map();\nconst lastScrollPosition: Map<HTMLElement, { x: number; y: number }> = new Map();\n\nconst scrollHandler = (event: Event) => {\n const target = event.target as HTMLElement;\n if (!target) {\n return;\n }\n\n const lastPosition = lastScrollPosition.get(target) || null;\n if (lastPosition === null) {\n // если мы не знаем предыдущую позицию для данного скроллящегося контейнера, то мы не сможем посчитать дельту\n // поэтому просто запоминаем текущую позицию и предотвращаем дальнейший обработку события\n lastScrollPosition.set(target, { x: target.scrollLeft, y: target.scrollTop });\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n\n // обращения к scrollLeft и scrollTop вызывают рефлоу, поэтому кешируем их значения\n const scrollValues = { scrollLeft: target.scrollLeft, scrollTop: target.scrollTop };\n const scrollDelta = {\n x: scrollValues.scrollLeft - lastPosition.x,\n y: scrollValues.scrollTop - lastPosition.y,\n };\n\n lastScrollPosition.set(target, { x: scrollValues.scrollLeft, y: scrollValues.scrollTop });\n\n if (scrollSubscriptions.length === 0) {\n return;\n }\n const canceledSubscriptions = canceledScrollSubscriptions.get(target);\n\n const subscriptions =\n canceledSubscriptions === undefined\n ? scrollSubscriptions\n : scrollSubscriptions.filter((subscription) => !canceledSubscriptions.includes(subscription));\n\n subscriptions.forEach((subscription) => subscription(target, scrollDelta.x, scrollDelta.y));\n};\n\nconst initialize = () => {\n if (isInitialized) {\n return;\n }\n\n isInitialized = true;\n document.addEventListener('scroll', scrollHandler, { capture: true, passive: false });\n};\n\nconst suspendSubscription = (callback: SubscriptionCallback): void => {\n const index = scrollSubscriptions.indexOf(callback);\n if (index !== -1) {\n scrollSubscriptions.splice(index, 1);\n }\n};\n\nconst reviveSubscription = (callback: SubscriptionCallback): void => {\n initialize();\n scrollSubscriptions.push(callback);\n};\n\nexport const deleteScrollSubscription = (callback: SubscriptionCallback): void => {\n const index = scrollSubscriptions.indexOf(callback);\n if (index !== -1) {\n scrollSubscriptions.splice(index, 1);\n }\n for (const [key, callbacks] of canceledScrollSubscriptions.entries()) {\n const index = callbacks.indexOf(callback);\n if (index !== -1) {\n canceledScrollSubscriptions.set(key, callbacks.splice(index, 1));\n }\n }\n};\n\nconst unsubscribeFromTarget = (target: HTMLElement, callback: SubscriptionCallback): void => {\n if (!canceledScrollSubscriptions.has(target)) {\n canceledScrollSubscriptions.set(target, []);\n }\n canceledScrollSubscriptions.get(target)?.push(callback);\n};\n\nconst updateDropTranslation = requestAnimation(\n (\n _,\n params: {\n dropRef: RefObject<HTMLElement>;\n deltaX: number;\n deltaY: number;\n currentTranslationRef: MutableRefObject<{ x: number; y: number }>;\n }\n ) => {\n const { dropRef, deltaX, deltaY, currentTranslationRef } = params;\n if (!dropRef.current) {\n return;\n }\n currentTranslationRef.current.x -= deltaX;\n currentTranslationRef.current.y -= deltaY;\n dropRef.current.style.transform = `translate3d(${currentTranslationRef.current.x}px, ${currentTranslationRef.current.y}px, 0)`;\n }\n);\n\nexport const useScrollSubscription = (\n activatorRef: RefObject<HTMLElement>,\n dropRef: RefObject<HTMLElement>,\n isVisible: boolean\n): void => {\n /**\n * список id скроллящихся элементов для которых была выполнена проверка\n * влияет ли их скролл на взаимное положение активатора и дропа\n */\n const processedScrollContainers = useRef<Set<HTMLElement>>(new Set());\n /**\n * текущее значение трансформации дропа\n * при каждом ререндере сбрасывается, т.к. дроп при каждом ререндере пересчитывает свою позицию\n */\n const currentTranslationRef = useRef({ x: 0, y: 0 });\n currentTranslationRef.current = { x: 0, y: 0 };\n /**\n * ссылка на последнее значение расстояния между активатором и дропом,\n * используется для определения изменения взаимного положения активатора и дропа\n */\n const visibleRef = useRef(isVisible);\n visibleRef.current = isVisible;\n\n const scrollCallback = useCallback(\n (target: HTMLElement, deltaX: number, deltaY: number) => {\n if (!visibleRef.current || !dropRef.current || !activatorRef.current) {\n return;\n }\n\n // Если это первый скролл данного контейнера, то проверяем содержит ли он активатор и дроп\n // Если он содержит только что-то одно, значит его скролл будет влиять на взаимное расположение дропа\n // и активатора, в этом случае помечяем его как обработанный и меняем позицию дропа при его скролле.\n // Если же он не влияет на взаимное расположение дропа и активатора, то отписываемся от дальнейших\n // оповещений о его скролле.\n if (!processedScrollContainers.current.has(target)) {\n const targetContainsActivator = target.contains(activatorRef.current);\n const targetContainsDrop = target.contains(dropRef.current);\n\n if (targetContainsActivator === targetContainsDrop) {\n unsubscribeFromTarget(target, scrollCallback);\n return;\n }\n processedScrollContainers.current.add(target);\n }\n\n updateDropTranslation({ deltaX, deltaY, dropRef, currentTranslationRef });\n },\n [activatorRef, dropRef]\n );\n\n useEffect(() => {\n // eslint-disable-next-line no-unused-expressions\n isVisible ? reviveSubscription(scrollCallback) : suspendSubscription(scrollCallback);\n }, [isVisible, scrollCallback]);\n\n useEffect(() => {\n return () => deleteScrollSubscription(scrollCallback);\n }, [scrollCallback]);\n};\n"],"names":[],"mappings":"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"}
|
package/useRenderParams.d.ts
DELETED
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
import { RefObject } from 'react';
|
|
2
|
-
import type { ActivatorOffset, DropBaseProps, DropMetrics, CustomVisualViewport, ArrowGuardDistance, DOMRectLike, DropBaseHorizontalPosition, DropBaseVerticalPosition, DropBaseHorizontalPositionWithoutCenter, DropBaseVerticalPositionWithoutCenter, Metrics } from '@hh.ru/magritte-internal-drop-base/types';
|
|
3
|
-
export declare const allowedAlignmentForVerticalDirection: readonly ["left", "right", "center"];
|
|
4
|
-
export declare const allowedAlignmentForHorizontalDirection: readonly ["top", "bottom", "center"];
|
|
5
|
-
export declare const allowedAlignmentForVerticalDirectionWithoutCenter: readonly ["left", "right"];
|
|
6
|
-
export declare const allowedAlignmentForHorizontalDirectionWithoutCenter: readonly ["top", "bottom"];
|
|
7
|
-
export declare const verticalDirections: readonly ["top", "bottom"];
|
|
8
|
-
export declare const horizontalDirections: readonly ["left", "right"];
|
|
9
|
-
export declare const START_OFFSET = -10000;
|
|
10
|
-
export declare const INITIAL_HEIGHT_VALUE = "force-initial-height";
|
|
11
|
-
interface FindDynamicPositionHor {
|
|
12
|
-
directions: typeof horizontalDirections;
|
|
13
|
-
alignments: typeof allowedAlignmentForHorizontalDirection | typeof allowedAlignmentForHorizontalDirectionWithoutCenter;
|
|
14
|
-
}
|
|
15
|
-
interface FindDynamicPositionVert {
|
|
16
|
-
directions: typeof verticalDirections;
|
|
17
|
-
alignments: typeof allowedAlignmentForVerticalDirection | typeof allowedAlignmentForVerticalDirectionWithoutCenter;
|
|
18
|
-
}
|
|
19
|
-
interface FindDynamicPositionElementMetrics {
|
|
20
|
-
activatorMetrics: DOMRect;
|
|
21
|
-
dropMetrics: DOMRectLike;
|
|
22
|
-
viewportMetrics: CustomVisualViewport;
|
|
23
|
-
activatorOffset: ActivatorOffset;
|
|
24
|
-
forceFitIntoViewport?: boolean;
|
|
25
|
-
guardDistance: number;
|
|
26
|
-
arrowGuardDistance?: ArrowGuardDistance;
|
|
27
|
-
occupyAllAvailableViewportHeight: boolean;
|
|
28
|
-
}
|
|
29
|
-
type ResultPosition = {
|
|
30
|
-
viewportMetrics: CustomVisualViewport;
|
|
31
|
-
hasScroll?: boolean;
|
|
32
|
-
dropMetricsRelativeToViewport: {
|
|
33
|
-
top: number;
|
|
34
|
-
bottom: number;
|
|
35
|
-
left: number;
|
|
36
|
-
right: number;
|
|
37
|
-
};
|
|
38
|
-
dropMetrics: DropMetrics;
|
|
39
|
-
} & (DropBaseHorizontalPosition | DropBaseVerticalPosition | DropBaseHorizontalPositionWithoutCenter | DropBaseVerticalPositionWithoutCenter);
|
|
40
|
-
type GetDropMetricsByPositionAndAlignment<T extends DropBaseHorizontalPosition | DropBaseVerticalPosition | DropBaseHorizontalPositionWithoutCenter | DropBaseVerticalPositionWithoutCenter> = FindDynamicPositionElementMetrics & Pick<DropBaseProps<T>, 'direction' | 'alignment'>;
|
|
41
|
-
export declare const getDropMetricsByPositionAndAlignment: <T extends DropBaseHorizontalPosition | DropBaseVerticalPosition | DropBaseVerticalPositionWithoutCenter | DropBaseHorizontalPositionWithoutCenter>({ activatorMetrics, dropMetrics, viewportMetrics, direction, alignment, arrowGuardDistance, activatorOffset, forceFitIntoViewport, guardDistance, occupyAllAvailableViewportHeight, }: GetDropMetricsByPositionAndAlignment<T>) => ResultPosition | null;
|
|
42
|
-
export declare function findDynamicPosition<T extends FindDynamicPositionHor | FindDynamicPositionVert>({ activatorMetrics, arrowGuardDistance, dropMetrics, viewportMetrics, activatorOffset, guardDistance, occupyAllAvailableViewportHeight, }: FindDynamicPositionElementMetrics, { directions, alignments }: T): ResultPosition | null;
|
|
43
|
-
export type RenderParamsProps<T extends DropBaseHorizontalPosition | DropBaseVerticalPosition | DropBaseHorizontalPositionWithoutCenter | DropBaseVerticalPositionWithoutCenter> = Omit<DropBaseProps<T>, 'children' | 'animationClassNames' | 'animationTimeout' | 'guardDistance' | 'role'> & {
|
|
44
|
-
dropElementRef: RefObject<HTMLElement>;
|
|
45
|
-
dropScrollableContainerRef: RefObject<HTMLElement>;
|
|
46
|
-
guardDistance: number;
|
|
47
|
-
widthEqualToActivator?: boolean;
|
|
48
|
-
};
|
|
49
|
-
export declare const useRenderParams: <T extends DropBaseHorizontalPosition | DropBaseVerticalPosition | DropBaseVerticalPositionWithoutCenter | DropBaseHorizontalPositionWithoutCenter>({ direction, alignment, activatorRef, dropElementRef, host, arrowGuardDistance, preferredViewport, visible, guardDistance, occupyAllAvailableViewportHeight, dropScrollableContainerRef, forcePosition, widthEqualToActivator, }: RenderParamsProps<T>) => {
|
|
50
|
-
metrics: Metrics;
|
|
51
|
-
position: DropBaseHorizontalPosition | DropBaseVerticalPosition | DropBaseHorizontalPositionWithoutCenter | DropBaseVerticalPositionWithoutCenter;
|
|
52
|
-
};
|
|
53
|
-
export {};
|