@jsenv/dom 0.6.1 → 0.7.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.
Files changed (109) hide show
  1. package/dist/jsenv_dom.js +259 -314
  2. package/package.json +2 -4
  3. package/index.js +0 -124
  4. package/src/attr/add_attribute_effect.js +0 -93
  5. package/src/attr/attributes.js +0 -32
  6. package/src/color/color_constrast.js +0 -69
  7. package/src/color/color_parsing.js +0 -319
  8. package/src/color/color_scheme.js +0 -28
  9. package/src/color/pick_light_or_dark.js +0 -34
  10. package/src/color/resolve_css_color.js +0 -60
  11. package/src/demos/3_columns_resize_demo.html +0 -84
  12. package/src/demos/3_rows_resize_demo.html +0 -89
  13. package/src/demos/aside_and_main_demo.html +0 -93
  14. package/src/demos/coordinates_demo.html +0 -450
  15. package/src/demos/document_autoscroll_demo.html +0 -517
  16. package/src/demos/drag_gesture_constraints_demo.html +0 -701
  17. package/src/demos/drag_gesture_demo.html +0 -1047
  18. package/src/demos/drag_gesture_element_to_impact_demo.html +0 -445
  19. package/src/demos/drag_reference_element_demo.html +0 -480
  20. package/src/demos/flex_details_set_demo.html +0 -302
  21. package/src/demos/flex_details_set_demo_2.html +0 -315
  22. package/src/demos/visible_rect_demo.html +0 -525
  23. package/src/element_signature.js +0 -100
  24. package/src/interaction/drag/constraint_feedback_line.js +0 -92
  25. package/src/interaction/drag/drag_constraint.js +0 -659
  26. package/src/interaction/drag/drag_debug_markers.js +0 -635
  27. package/src/interaction/drag/drag_element_positioner.js +0 -382
  28. package/src/interaction/drag/drag_gesture.js +0 -566
  29. package/src/interaction/drag/drag_resize_demo.html +0 -571
  30. package/src/interaction/drag/drag_to_move.js +0 -301
  31. package/src/interaction/drag/drag_to_resize_gesture.js +0 -68
  32. package/src/interaction/drag/drop_target_detection.js +0 -148
  33. package/src/interaction/drag/sticky_frontiers.js +0 -160
  34. package/src/interaction/event_marker.js +0 -14
  35. package/src/interaction/focus/active_element.js +0 -33
  36. package/src/interaction/focus/arrow_navigation.js +0 -599
  37. package/src/interaction/focus/element_is_focusable.js +0 -57
  38. package/src/interaction/focus/element_visibility.js +0 -111
  39. package/src/interaction/focus/find_focusable.js +0 -21
  40. package/src/interaction/focus/focus_group.js +0 -91
  41. package/src/interaction/focus/focus_group_registry.js +0 -12
  42. package/src/interaction/focus/focus_nav.js +0 -12
  43. package/src/interaction/focus/focus_nav_event_marker.js +0 -14
  44. package/src/interaction/focus/focus_trap.js +0 -105
  45. package/src/interaction/focus/tab_navigation.js +0 -128
  46. package/src/interaction/focus/tests/focus_group_skip_tab_test.html +0 -206
  47. package/src/interaction/focus/tests/tree_focus_test.html +0 -304
  48. package/src/interaction/focus/tests/tree_focus_test.jsx +0 -261
  49. package/src/interaction/focus/tests/tree_focus_test_preact.html +0 -13
  50. package/src/interaction/isolate_interactions.js +0 -161
  51. package/src/interaction/keyboard.js +0 -26
  52. package/src/interaction/scroll/capture_scroll.js +0 -47
  53. package/src/interaction/scroll/is_scrollable.js +0 -159
  54. package/src/interaction/scroll/scroll_container.js +0 -110
  55. package/src/interaction/scroll/scroll_trap.js +0 -44
  56. package/src/interaction/scroll/scrollbar_size.js +0 -20
  57. package/src/interaction/scroll/wheel_through.js +0 -138
  58. package/src/iterable_weak_set.js +0 -66
  59. package/src/position/dom_coords.js +0 -340
  60. package/src/position/offset_parent.js +0 -15
  61. package/src/position/position_fixed.js +0 -15
  62. package/src/position/position_sticky.js +0 -213
  63. package/src/position/sticky_rect.js +0 -79
  64. package/src/position/visible_rect.js +0 -486
  65. package/src/pub_sub.js +0 -31
  66. package/src/size/can_take_size.js +0 -11
  67. package/src/size/details_content_full_height.js +0 -63
  68. package/src/size/flex_details_set.js +0 -974
  69. package/src/size/get_available_height.js +0 -22
  70. package/src/size/get_available_width.js +0 -22
  71. package/src/size/get_border_sizes.js +0 -14
  72. package/src/size/get_height.js +0 -4
  73. package/src/size/get_inner_height.js +0 -15
  74. package/src/size/get_inner_width.js +0 -15
  75. package/src/size/get_margin_sizes.js +0 -10
  76. package/src/size/get_max_height.js +0 -57
  77. package/src/size/get_max_width.js +0 -47
  78. package/src/size/get_min_height.js +0 -14
  79. package/src/size/get_min_width.js +0 -14
  80. package/src/size/get_padding_sizes.js +0 -10
  81. package/src/size/get_width.js +0 -4
  82. package/src/size/hooks/use_available_height.js +0 -27
  83. package/src/size/hooks/use_available_width.js +0 -27
  84. package/src/size/hooks/use_max_height.js +0 -10
  85. package/src/size/hooks/use_max_width.js +0 -10
  86. package/src/size/hooks/use_resize_status.js +0 -62
  87. package/src/size/resize.js +0 -695
  88. package/src/size/resolve_css_size.js +0 -32
  89. package/src/style/dom_styles.js +0 -97
  90. package/src/style/style_composition.js +0 -121
  91. package/src/style/style_controller.js +0 -345
  92. package/src/style/style_default.js +0 -153
  93. package/src/style/style_default_demo.html +0 -128
  94. package/src/style/style_parsing.js +0 -375
  95. package/src/transition/demos/animation_resumption_test.xhtml +0 -500
  96. package/src/transition/demos/height_toggle_test.xhtml +0 -515
  97. package/src/transition/dom_transition.js +0 -254
  98. package/src/transition/easing.js +0 -48
  99. package/src/transition/group_transition.js +0 -261
  100. package/src/transition/transform_style_parser.js +0 -32
  101. package/src/transition/transition_playback.js +0 -366
  102. package/src/transition/transition_timeline.js +0 -79
  103. package/src/traversal.js +0 -247
  104. package/src/ui_transition/demos/content_states_transition_demo.html +0 -628
  105. package/src/ui_transition/demos/smooth_height_transition_demo.html +0 -149
  106. package/src/ui_transition/demos/transition_testing.html +0 -354
  107. package/src/ui_transition/ui_transition.js +0 -1470
  108. package/src/utils.js +0 -69
  109. 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
- };