@jsenv/dom 0.6.1 → 0.7.1
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/dist/jsenv_dom.js +339 -327
- package/package.json +2 -4
- package/index.js +0 -124
- package/src/attr/add_attribute_effect.js +0 -93
- package/src/attr/attributes.js +0 -32
- package/src/color/color_constrast.js +0 -69
- package/src/color/color_parsing.js +0 -319
- package/src/color/color_scheme.js +0 -28
- package/src/color/pick_light_or_dark.js +0 -34
- package/src/color/resolve_css_color.js +0 -60
- package/src/demos/3_columns_resize_demo.html +0 -84
- package/src/demos/3_rows_resize_demo.html +0 -89
- package/src/demos/aside_and_main_demo.html +0 -93
- package/src/demos/coordinates_demo.html +0 -450
- package/src/demos/document_autoscroll_demo.html +0 -517
- package/src/demos/drag_gesture_constraints_demo.html +0 -701
- package/src/demos/drag_gesture_demo.html +0 -1047
- package/src/demos/drag_gesture_element_to_impact_demo.html +0 -445
- package/src/demos/drag_reference_element_demo.html +0 -480
- package/src/demos/flex_details_set_demo.html +0 -302
- package/src/demos/flex_details_set_demo_2.html +0 -315
- package/src/demos/visible_rect_demo.html +0 -525
- package/src/element_signature.js +0 -100
- package/src/interaction/drag/constraint_feedback_line.js +0 -92
- package/src/interaction/drag/drag_constraint.js +0 -659
- package/src/interaction/drag/drag_debug_markers.js +0 -635
- package/src/interaction/drag/drag_element_positioner.js +0 -382
- package/src/interaction/drag/drag_gesture.js +0 -566
- package/src/interaction/drag/drag_resize_demo.html +0 -571
- package/src/interaction/drag/drag_to_move.js +0 -301
- package/src/interaction/drag/drag_to_resize_gesture.js +0 -68
- package/src/interaction/drag/drop_target_detection.js +0 -148
- package/src/interaction/drag/sticky_frontiers.js +0 -160
- package/src/interaction/event_marker.js +0 -14
- package/src/interaction/focus/active_element.js +0 -33
- package/src/interaction/focus/arrow_navigation.js +0 -599
- package/src/interaction/focus/element_is_focusable.js +0 -57
- package/src/interaction/focus/element_visibility.js +0 -111
- package/src/interaction/focus/find_focusable.js +0 -21
- package/src/interaction/focus/focus_group.js +0 -91
- package/src/interaction/focus/focus_group_registry.js +0 -12
- package/src/interaction/focus/focus_nav.js +0 -12
- package/src/interaction/focus/focus_nav_event_marker.js +0 -14
- package/src/interaction/focus/focus_trap.js +0 -105
- package/src/interaction/focus/tab_navigation.js +0 -128
- package/src/interaction/focus/tests/focus_group_skip_tab_test.html +0 -206
- package/src/interaction/focus/tests/tree_focus_test.html +0 -304
- package/src/interaction/focus/tests/tree_focus_test.jsx +0 -261
- package/src/interaction/focus/tests/tree_focus_test_preact.html +0 -13
- package/src/interaction/isolate_interactions.js +0 -161
- package/src/interaction/keyboard.js +0 -26
- package/src/interaction/scroll/capture_scroll.js +0 -47
- package/src/interaction/scroll/is_scrollable.js +0 -159
- package/src/interaction/scroll/scroll_container.js +0 -110
- package/src/interaction/scroll/scroll_trap.js +0 -44
- package/src/interaction/scroll/scrollbar_size.js +0 -20
- package/src/interaction/scroll/wheel_through.js +0 -138
- package/src/iterable_weak_set.js +0 -66
- package/src/position/dom_coords.js +0 -340
- package/src/position/offset_parent.js +0 -15
- package/src/position/position_fixed.js +0 -15
- package/src/position/position_sticky.js +0 -213
- package/src/position/sticky_rect.js +0 -79
- package/src/position/visible_rect.js +0 -486
- package/src/pub_sub.js +0 -31
- package/src/size/can_take_size.js +0 -11
- package/src/size/details_content_full_height.js +0 -63
- package/src/size/flex_details_set.js +0 -974
- package/src/size/get_available_height.js +0 -22
- package/src/size/get_available_width.js +0 -22
- package/src/size/get_border_sizes.js +0 -14
- package/src/size/get_height.js +0 -4
- package/src/size/get_inner_height.js +0 -15
- package/src/size/get_inner_width.js +0 -15
- package/src/size/get_margin_sizes.js +0 -10
- package/src/size/get_max_height.js +0 -57
- package/src/size/get_max_width.js +0 -47
- package/src/size/get_min_height.js +0 -14
- package/src/size/get_min_width.js +0 -14
- package/src/size/get_padding_sizes.js +0 -10
- package/src/size/get_width.js +0 -4
- package/src/size/hooks/use_available_height.js +0 -27
- package/src/size/hooks/use_available_width.js +0 -27
- package/src/size/hooks/use_max_height.js +0 -10
- package/src/size/hooks/use_max_width.js +0 -10
- package/src/size/hooks/use_resize_status.js +0 -62
- package/src/size/resize.js +0 -695
- package/src/size/resolve_css_size.js +0 -32
- package/src/style/dom_styles.js +0 -97
- package/src/style/style_composition.js +0 -121
- package/src/style/style_controller.js +0 -345
- package/src/style/style_default.js +0 -153
- package/src/style/style_default_demo.html +0 -128
- package/src/style/style_parsing.js +0 -375
- package/src/transition/demos/animation_resumption_test.xhtml +0 -500
- package/src/transition/demos/height_toggle_test.xhtml +0 -515
- package/src/transition/dom_transition.js +0 -254
- package/src/transition/easing.js +0 -48
- package/src/transition/group_transition.js +0 -261
- package/src/transition/transform_style_parser.js +0 -32
- package/src/transition/transition_playback.js +0 -366
- package/src/transition/transition_timeline.js +0 -79
- package/src/traversal.js +0 -247
- package/src/ui_transition/demos/content_states_transition_demo.html +0 -628
- package/src/ui_transition/demos/smooth_height_transition_demo.html +0 -149
- package/src/ui_transition/demos/transition_testing.html +0 -354
- package/src/ui_transition/ui_transition.js +0 -1470
- package/src/utils.js +0 -69
- package/src/value_effect.js +0 -35
|
@@ -1,382 +0,0 @@
|
|
|
1
|
-
import { findSelfOrAncestorFixedPosition } from "../../position/position_fixed.js";
|
|
2
|
-
import { getScrollContainer } from "../scroll/scroll_container.js";
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Creates a coordinate system positioner for drag operations.
|
|
6
|
-
*
|
|
7
|
-
* ARCHITECTURE:
|
|
8
|
-
* This function uses a modular offset-based approach to handle coordinate system conversions
|
|
9
|
-
* between different positioning contexts (scroll containers and positioned parents).
|
|
10
|
-
*
|
|
11
|
-
* The system decomposes coordinate conversion into two types of offsets:
|
|
12
|
-
* 1. Position offsets - compensate for different positioned parents
|
|
13
|
-
* 2. Scroll offsets - handle scroll position and container differences
|
|
14
|
-
*
|
|
15
|
-
* COORDINATE SYSTEM:
|
|
16
|
-
* - Input coordinates are relative to the reference element's scroll container
|
|
17
|
-
* - Output coordinates are relative to the element's positioned parent for DOM positioning
|
|
18
|
-
* - Handles cross-coordinate system scenarios (different scroll containers and positioned parents)
|
|
19
|
-
*
|
|
20
|
-
* KEY SCENARIOS SUPPORTED:
|
|
21
|
-
* 1. Same positioned parent, same scroll container - Simple case, minimal offsets
|
|
22
|
-
* 2. Different positioned parents, same scroll container - Position offset compensation
|
|
23
|
-
* 3. Same positioned parent, different scroll containers - Scroll offset handling
|
|
24
|
-
* 4. Different positioned parents, different scroll containers - Full offset compensation
|
|
25
|
-
* 5. Overlay elements - Special handling for elements with data-overlay-for attribute
|
|
26
|
-
* 6. Fixed positioning - Special scroll offset handling for fixed positioned elements
|
|
27
|
-
*
|
|
28
|
-
* API CONTRACT:
|
|
29
|
-
* Returns [scrollableLeft, scrollableTop, convertScrollablePosition] where:
|
|
30
|
-
*
|
|
31
|
-
* - scrollableLeft/scrollableTop:
|
|
32
|
-
* Current element coordinates in the reference coordinate system (adjusted for position offsets)
|
|
33
|
-
*
|
|
34
|
-
* - convertScrollablePosition:
|
|
35
|
-
* Converts reference coordinate system positions to DOM positioning coordinates
|
|
36
|
-
* Applies both position and scroll offsets for accurate element placement
|
|
37
|
-
*
|
|
38
|
-
* IMPLEMENTATION STRATEGY:
|
|
39
|
-
* Uses factory functions to create specialized offset calculators based on the specific
|
|
40
|
-
* combination of positioning contexts, optimizing for performance and code clarity.
|
|
41
|
-
*/
|
|
42
|
-
|
|
43
|
-
export const createDragElementPositioner = (
|
|
44
|
-
element,
|
|
45
|
-
referenceElement,
|
|
46
|
-
elementToMove,
|
|
47
|
-
) => {
|
|
48
|
-
let scrollableLeft;
|
|
49
|
-
let scrollableTop;
|
|
50
|
-
let convertScrollablePosition;
|
|
51
|
-
|
|
52
|
-
const positionedParent = elementToMove
|
|
53
|
-
? elementToMove.offsetParent
|
|
54
|
-
: element.offsetParent;
|
|
55
|
-
const scrollContainer = getScrollContainer(element);
|
|
56
|
-
const [getPositionOffsets, getScrollOffsets] = createGetOffsets({
|
|
57
|
-
positionedParent,
|
|
58
|
-
referencePositionedParent: referenceElement
|
|
59
|
-
? referenceElement.offsetParent
|
|
60
|
-
: undefined,
|
|
61
|
-
scrollContainer,
|
|
62
|
-
referenceScrollContainer: referenceElement
|
|
63
|
-
? getScrollContainer(referenceElement)
|
|
64
|
-
: undefined,
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
scrollable_current: {
|
|
68
|
-
[scrollableLeft, scrollableTop] = getScrollablePosition(
|
|
69
|
-
element,
|
|
70
|
-
scrollContainer,
|
|
71
|
-
);
|
|
72
|
-
const [positionOffsetLeft, positionOffsetTop] = getPositionOffsets();
|
|
73
|
-
scrollableLeft += positionOffsetLeft;
|
|
74
|
-
scrollableTop += positionOffsetTop;
|
|
75
|
-
}
|
|
76
|
-
scrollable_converter: {
|
|
77
|
-
convertScrollablePosition = (
|
|
78
|
-
scrollableLeftToConvert,
|
|
79
|
-
scrollableTopToConvert,
|
|
80
|
-
) => {
|
|
81
|
-
const [positionOffsetLeft, positionOffsetTop] = getPositionOffsets();
|
|
82
|
-
const [scrollOffsetLeft, scrollOffsetTop] = getScrollOffsets();
|
|
83
|
-
|
|
84
|
-
const positionedLeftWithoutScroll =
|
|
85
|
-
scrollableLeftToConvert + positionOffsetLeft;
|
|
86
|
-
const positionedTopWithoutScroll =
|
|
87
|
-
scrollableTopToConvert + positionOffsetTop;
|
|
88
|
-
const positionedLeft = positionedLeftWithoutScroll + scrollOffsetLeft;
|
|
89
|
-
const positionedTop = positionedTopWithoutScroll + scrollOffsetTop;
|
|
90
|
-
|
|
91
|
-
return [positionedLeft, positionedTop];
|
|
92
|
-
};
|
|
93
|
-
}
|
|
94
|
-
return [scrollableLeft, scrollableTop, convertScrollablePosition];
|
|
95
|
-
};
|
|
96
|
-
|
|
97
|
-
const getScrollablePosition = (element, scrollContainer) => {
|
|
98
|
-
const { left: elementViewportLeft, top: elementViewportTop } =
|
|
99
|
-
element.getBoundingClientRect();
|
|
100
|
-
const scrollContainerIsDocument = scrollContainer === documentElement;
|
|
101
|
-
if (scrollContainerIsDocument) {
|
|
102
|
-
return [elementViewportLeft, elementViewportTop];
|
|
103
|
-
}
|
|
104
|
-
const { left: scrollContainerLeft, top: scrollContainerTop } =
|
|
105
|
-
scrollContainer.getBoundingClientRect();
|
|
106
|
-
const scrollableLeft = elementViewportLeft - scrollContainerLeft;
|
|
107
|
-
const scrollableTop = elementViewportTop - scrollContainerTop;
|
|
108
|
-
|
|
109
|
-
return [scrollableLeft, scrollableTop];
|
|
110
|
-
};
|
|
111
|
-
|
|
112
|
-
const createGetOffsets = ({
|
|
113
|
-
positionedParent,
|
|
114
|
-
referencePositionedParent = positionedParent,
|
|
115
|
-
scrollContainer,
|
|
116
|
-
referenceScrollContainer = scrollContainer,
|
|
117
|
-
}) => {
|
|
118
|
-
const samePositionedParent = positionedParent === referencePositionedParent;
|
|
119
|
-
const getScrollOffsets = createGetScrollOffsets(
|
|
120
|
-
scrollContainer,
|
|
121
|
-
referenceScrollContainer,
|
|
122
|
-
positionedParent,
|
|
123
|
-
samePositionedParent,
|
|
124
|
-
);
|
|
125
|
-
|
|
126
|
-
if (samePositionedParent) {
|
|
127
|
-
return [() => [0, 0], getScrollOffsets];
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
// parents are different, oh boy let's go
|
|
131
|
-
// The overlay case is problematic because the overlay adjust its position to the target dynamically
|
|
132
|
-
// This creates something complex to support properly.
|
|
133
|
-
// When overlay is fixed we there will never be any offset
|
|
134
|
-
// When overlay is absolute there is a diff relative to the scroll
|
|
135
|
-
// and eventually if the overlay is positioned differently than the other parent
|
|
136
|
-
if (isOverlayOf(positionedParent, referencePositionedParent)) {
|
|
137
|
-
return createGetOffsetsForOverlay(
|
|
138
|
-
positionedParent,
|
|
139
|
-
referencePositionedParent,
|
|
140
|
-
{
|
|
141
|
-
scrollContainer,
|
|
142
|
-
referenceScrollContainer,
|
|
143
|
-
getScrollOffsets,
|
|
144
|
-
},
|
|
145
|
-
);
|
|
146
|
-
}
|
|
147
|
-
if (isOverlayOf(referencePositionedParent, positionedParent)) {
|
|
148
|
-
return createGetOffsetsForOverlay(
|
|
149
|
-
referencePositionedParent,
|
|
150
|
-
positionedParent,
|
|
151
|
-
{
|
|
152
|
-
scrollContainer,
|
|
153
|
-
referenceScrollContainer,
|
|
154
|
-
getScrollOffsets,
|
|
155
|
-
},
|
|
156
|
-
);
|
|
157
|
-
}
|
|
158
|
-
const scrollContainerIsDocument = scrollContainer === documentElement;
|
|
159
|
-
if (scrollContainerIsDocument) {
|
|
160
|
-
// Document case: getBoundingClientRect already includes document scroll effects
|
|
161
|
-
// Add current scroll position to get the static offset
|
|
162
|
-
const getPositionOffsetsDocumentScrolling = () => {
|
|
163
|
-
const { scrollLeft: documentScrollLeft, scrollTop: documentScrollTop } =
|
|
164
|
-
scrollContainer;
|
|
165
|
-
const aRect = positionedParent.getBoundingClientRect();
|
|
166
|
-
const bRect = referencePositionedParent.getBoundingClientRect();
|
|
167
|
-
const aLeft = aRect.left;
|
|
168
|
-
const aTop = aRect.top;
|
|
169
|
-
const bLeft = bRect.left;
|
|
170
|
-
const bTop = bRect.top;
|
|
171
|
-
const aLeftDocument = documentScrollLeft + aLeft;
|
|
172
|
-
const aTopDocument = documentScrollTop + aTop;
|
|
173
|
-
const bLeftDocument = documentScrollLeft + bLeft;
|
|
174
|
-
const bTopDocument = documentScrollTop + bTop;
|
|
175
|
-
const offsetLeft = bLeftDocument - aLeftDocument;
|
|
176
|
-
const offsetTop = bTopDocument - aTopDocument;
|
|
177
|
-
return [offsetLeft, offsetTop];
|
|
178
|
-
};
|
|
179
|
-
return [getPositionOffsetsDocumentScrolling, getScrollOffsets];
|
|
180
|
-
}
|
|
181
|
-
// Custom scroll container case: account for container's position and scroll
|
|
182
|
-
const getPositionOffsetsCustomScrollContainer = () => {
|
|
183
|
-
const aRect = positionedParent.getBoundingClientRect();
|
|
184
|
-
const bRect = referencePositionedParent.getBoundingClientRect();
|
|
185
|
-
const aLeft = aRect.left;
|
|
186
|
-
const aTop = aRect.top;
|
|
187
|
-
const bLeft = bRect.left;
|
|
188
|
-
const bTop = bRect.top;
|
|
189
|
-
|
|
190
|
-
const scrollContainerRect = scrollContainer.getBoundingClientRect();
|
|
191
|
-
const offsetLeft =
|
|
192
|
-
bLeft - aLeft + scrollContainer.scrollLeft - scrollContainerRect.left;
|
|
193
|
-
const offsetTop =
|
|
194
|
-
bTop - aTop + scrollContainer.scrollTop - scrollContainerRect.top;
|
|
195
|
-
return [offsetLeft, offsetTop];
|
|
196
|
-
};
|
|
197
|
-
return [getPositionOffsetsCustomScrollContainer, getScrollOffsets];
|
|
198
|
-
};
|
|
199
|
-
const createGetOffsetsForOverlay = (
|
|
200
|
-
overlay,
|
|
201
|
-
overlayTarget,
|
|
202
|
-
{ scrollContainer, referenceScrollContainer, getScrollOffsets },
|
|
203
|
-
) => {
|
|
204
|
-
const sameScrollContainer = scrollContainer === referenceScrollContainer;
|
|
205
|
-
const scrollContainerIsDocument =
|
|
206
|
-
scrollContainer === document.documentElement;
|
|
207
|
-
const referenceScrollContainerIsDocument =
|
|
208
|
-
referenceScrollContainer === documentElement;
|
|
209
|
-
|
|
210
|
-
if (getComputedStyle(overlay).position === "fixed") {
|
|
211
|
-
if (referenceScrollContainerIsDocument) {
|
|
212
|
-
const getPositionOffsetsFixedOverlay = () => {
|
|
213
|
-
return [0, 0];
|
|
214
|
-
};
|
|
215
|
-
return [getPositionOffsetsFixedOverlay, getScrollOffsets];
|
|
216
|
-
}
|
|
217
|
-
const getPositionOffsetsFixedOverlay = () => {
|
|
218
|
-
const scrollContainerRect = scrollContainer.getBoundingClientRect();
|
|
219
|
-
const referenceScrollContainerRect =
|
|
220
|
-
referenceScrollContainer.getBoundingClientRect();
|
|
221
|
-
let offsetLeftBetweenScrollContainers =
|
|
222
|
-
referenceScrollContainerRect.left - scrollContainerRect.left;
|
|
223
|
-
let offsetTopBetweenScrollContainers =
|
|
224
|
-
referenceScrollContainerRect.top - scrollContainerRect.top;
|
|
225
|
-
if (scrollContainerIsDocument) {
|
|
226
|
-
offsetLeftBetweenScrollContainers -= scrollContainer.scrollLeft;
|
|
227
|
-
offsetTopBetweenScrollContainers -= scrollContainer.scrollTop;
|
|
228
|
-
}
|
|
229
|
-
return [
|
|
230
|
-
-offsetLeftBetweenScrollContainers,
|
|
231
|
-
-offsetTopBetweenScrollContainers,
|
|
232
|
-
];
|
|
233
|
-
};
|
|
234
|
-
return [getPositionOffsetsFixedOverlay, getScrollOffsets];
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
const getPositionOffsetsOverlay = () => {
|
|
238
|
-
if (sameScrollContainer) {
|
|
239
|
-
const overlayRect = overlay.getBoundingClientRect();
|
|
240
|
-
const overlayTargetRect = overlayTarget.getBoundingClientRect();
|
|
241
|
-
const overlayLeft = overlayRect.left;
|
|
242
|
-
const overlayTop = overlayRect.top;
|
|
243
|
-
let overlayTargetLeft = overlayTargetRect.left;
|
|
244
|
-
let overlayTargetTop = overlayTargetRect.top;
|
|
245
|
-
if (scrollContainerIsDocument) {
|
|
246
|
-
overlayTargetLeft += scrollContainer.scrollLeft;
|
|
247
|
-
overlayTargetTop += scrollContainer.scrollTop;
|
|
248
|
-
}
|
|
249
|
-
const offsetLeftBetweenTargetAndOverlay = overlayTargetLeft - overlayLeft;
|
|
250
|
-
const offsetTopBetweenTargetAndOverlay = overlayTargetTop - overlayTop;
|
|
251
|
-
return [
|
|
252
|
-
-scrollContainer.scrollLeft + offsetLeftBetweenTargetAndOverlay,
|
|
253
|
-
-scrollContainer.scrollTop + offsetTopBetweenTargetAndOverlay,
|
|
254
|
-
];
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
const scrollContainerRect = scrollContainer.getBoundingClientRect();
|
|
258
|
-
const referenceScrollContainerRect =
|
|
259
|
-
referenceScrollContainer.getBoundingClientRect();
|
|
260
|
-
let scrollContainerLeft = scrollContainerRect.left;
|
|
261
|
-
let scrollContainerTop = scrollContainerRect.top;
|
|
262
|
-
let referenceScrollContainerLeft = referenceScrollContainerRect.left;
|
|
263
|
-
let referenceScrollContainerTop = referenceScrollContainerRect.top;
|
|
264
|
-
if (scrollContainerIsDocument) {
|
|
265
|
-
scrollContainerLeft += scrollContainer.scrollLeft;
|
|
266
|
-
scrollContainerTop += scrollContainer.scrollTop;
|
|
267
|
-
}
|
|
268
|
-
const offsetLeftBetweenScrollContainers =
|
|
269
|
-
referenceScrollContainerLeft - scrollContainerLeft;
|
|
270
|
-
const offsetTopBetweenScrollContainers =
|
|
271
|
-
referenceScrollContainerTop - scrollContainerTop;
|
|
272
|
-
return [
|
|
273
|
-
-offsetLeftBetweenScrollContainers - referenceScrollContainer.scrollLeft,
|
|
274
|
-
-offsetTopBetweenScrollContainers - referenceScrollContainer.scrollTop,
|
|
275
|
-
];
|
|
276
|
-
};
|
|
277
|
-
const getScrollOffsetsOverlay = () => {
|
|
278
|
-
if (sameScrollContainer) {
|
|
279
|
-
return [scrollContainer.scrollLeft, scrollContainer.scrollTop];
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
const scrollContainerRect = scrollContainer.getBoundingClientRect();
|
|
283
|
-
const referenceScrollContainerRect =
|
|
284
|
-
referenceScrollContainer.getBoundingClientRect();
|
|
285
|
-
let offsetLeftBetweenScrollContainers =
|
|
286
|
-
referenceScrollContainerRect.left - scrollContainerRect.left;
|
|
287
|
-
let offsetTopBetweenScrollContainers =
|
|
288
|
-
referenceScrollContainerRect.top - scrollContainerRect.top;
|
|
289
|
-
if (scrollContainerIsDocument) {
|
|
290
|
-
offsetLeftBetweenScrollContainers -= scrollContainer.scrollLeft;
|
|
291
|
-
offsetTopBetweenScrollContainers -= scrollContainer.scrollTop;
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
return [
|
|
295
|
-
referenceScrollContainer.scrollLeft + offsetLeftBetweenScrollContainers,
|
|
296
|
-
referenceScrollContainer.scrollTop + offsetTopBetweenScrollContainers,
|
|
297
|
-
];
|
|
298
|
-
};
|
|
299
|
-
return [getPositionOffsetsOverlay, getScrollOffsetsOverlay];
|
|
300
|
-
};
|
|
301
|
-
const isOverlayOf = (element, potentialTarget) => {
|
|
302
|
-
const overlayForAttribute = element.getAttribute("data-overlay-for");
|
|
303
|
-
if (!overlayForAttribute) {
|
|
304
|
-
return false;
|
|
305
|
-
}
|
|
306
|
-
const overlayTarget = document.querySelector(`#${overlayForAttribute}`);
|
|
307
|
-
if (!overlayTarget) {
|
|
308
|
-
return false;
|
|
309
|
-
}
|
|
310
|
-
if (overlayTarget === potentialTarget) {
|
|
311
|
-
return true;
|
|
312
|
-
}
|
|
313
|
-
const overlayTargetPositionedParent = overlayTarget.offsetParent;
|
|
314
|
-
if (overlayTargetPositionedParent === potentialTarget) {
|
|
315
|
-
return true;
|
|
316
|
-
}
|
|
317
|
-
return false;
|
|
318
|
-
};
|
|
319
|
-
|
|
320
|
-
const { documentElement } = document;
|
|
321
|
-
const createGetScrollOffsets = (
|
|
322
|
-
scrollContainer,
|
|
323
|
-
referenceScrollContainer,
|
|
324
|
-
positionedParent,
|
|
325
|
-
samePositionedParent,
|
|
326
|
-
) => {
|
|
327
|
-
const getGetScrollOffsetsSameContainer = () => {
|
|
328
|
-
const scrollContainerIsDocument = scrollContainer === documentElement;
|
|
329
|
-
// I don't really get why we have to add scrollLeft (scrollLeft at grab)
|
|
330
|
-
// to properly position the element in this scenario
|
|
331
|
-
// It happens since we use translateX to position the element
|
|
332
|
-
// Or maybe since something else. In any case it works
|
|
333
|
-
const { scrollLeft, scrollTop } = samePositionedParent
|
|
334
|
-
? { scrollLeft: 0, scrollTop: 0 }
|
|
335
|
-
: referenceScrollContainer;
|
|
336
|
-
if (scrollContainerIsDocument) {
|
|
337
|
-
const fixedPosition = findSelfOrAncestorFixedPosition(positionedParent);
|
|
338
|
-
if (fixedPosition) {
|
|
339
|
-
const getScrollOffsetsFixed = () => {
|
|
340
|
-
const leftScrollToAdd = scrollLeft + fixedPosition[0];
|
|
341
|
-
const topScrollToAdd = scrollTop + fixedPosition[1];
|
|
342
|
-
return [leftScrollToAdd, topScrollToAdd];
|
|
343
|
-
};
|
|
344
|
-
return getScrollOffsetsFixed;
|
|
345
|
-
}
|
|
346
|
-
}
|
|
347
|
-
const getScrollOffsets = () => {
|
|
348
|
-
const leftScrollToAdd = scrollLeft + referenceScrollContainer.scrollLeft;
|
|
349
|
-
const topScrollToAdd = scrollTop + referenceScrollContainer.scrollTop;
|
|
350
|
-
return [leftScrollToAdd, topScrollToAdd];
|
|
351
|
-
};
|
|
352
|
-
return getScrollOffsets;
|
|
353
|
-
};
|
|
354
|
-
|
|
355
|
-
const sameScrollContainer = scrollContainer === referenceScrollContainer;
|
|
356
|
-
const getScrollOffsetsSameContainer = getGetScrollOffsetsSameContainer();
|
|
357
|
-
if (sameScrollContainer) {
|
|
358
|
-
return getScrollOffsetsSameContainer;
|
|
359
|
-
}
|
|
360
|
-
const getScrollOffsetsDifferentContainers = () => {
|
|
361
|
-
const [scrollLeftToAdd, scrollTopToAdd] = getScrollOffsetsSameContainer();
|
|
362
|
-
const rect = scrollContainer.getBoundingClientRect();
|
|
363
|
-
const referenceRect = referenceScrollContainer.getBoundingClientRect();
|
|
364
|
-
const leftDiff = referenceRect.left - rect.left;
|
|
365
|
-
const topDiff = referenceRect.top - rect.top;
|
|
366
|
-
return [scrollLeftToAdd + leftDiff, scrollTopToAdd + topDiff];
|
|
367
|
-
};
|
|
368
|
-
return getScrollOffsetsDifferentContainers;
|
|
369
|
-
};
|
|
370
|
-
export const getDragCoordinates = (
|
|
371
|
-
element,
|
|
372
|
-
scrollContainer = getScrollContainer(element),
|
|
373
|
-
) => {
|
|
374
|
-
const [scrollableLeft, scrollableTop] = getScrollablePosition(
|
|
375
|
-
element,
|
|
376
|
-
scrollContainer,
|
|
377
|
-
);
|
|
378
|
-
const { scrollLeft, scrollTop } = scrollContainer;
|
|
379
|
-
const leftRelativeToScrollContainer = scrollableLeft + scrollLeft;
|
|
380
|
-
const topRelativeToScrollContainer = scrollableTop + scrollTop;
|
|
381
|
-
return [leftRelativeToScrollContainer, topRelativeToScrollContainer];
|
|
382
|
-
};
|