@jsenv/dom 0.6.0 → 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.
- package/dist/jsenv_dom.js +262 -330
- 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 -1491
- package/src/utils.js +0 -69
- package/src/value_effect.js +0 -35
|
@@ -1,445 +0,0 @@
|
|
|
1
|
-
<!doctype html>
|
|
2
|
-
<html lang="en">
|
|
3
|
-
<head>
|
|
4
|
-
<meta charset="UTF-8" />
|
|
5
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
-
<title>Drag Gesture Demo - elementToImpact</title>
|
|
7
|
-
<style>
|
|
8
|
-
* {
|
|
9
|
-
box-sizing: border-box;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
body {
|
|
13
|
-
margin: 0;
|
|
14
|
-
padding: 20px;
|
|
15
|
-
font-family: Arial, sans-serif;
|
|
16
|
-
background: #f0f0f0;
|
|
17
|
-
min-height: 200vh; /* Make document scrollable */
|
|
18
|
-
min-width: 150vw; /* Make document scrollable horizontally too */
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
.demo-section {
|
|
22
|
-
margin: 40px auto;
|
|
23
|
-
max-width: 900px;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
.demo-title {
|
|
27
|
-
background: white;
|
|
28
|
-
padding: 15px 20px;
|
|
29
|
-
border-radius: 8px 8px 0 0;
|
|
30
|
-
border-bottom: 2px solid #333;
|
|
31
|
-
margin: 0;
|
|
32
|
-
font-size: 18px;
|
|
33
|
-
font-weight: bold;
|
|
34
|
-
color: #333;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
.container {
|
|
38
|
-
width: 800px;
|
|
39
|
-
height: 600px;
|
|
40
|
-
background: white;
|
|
41
|
-
position: relative;
|
|
42
|
-
margin: 0 auto;
|
|
43
|
-
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
|
|
44
|
-
border-radius: 4px;
|
|
45
|
-
border: 20px solid #ddd;
|
|
46
|
-
/* Remove overflow and overscroll-behavior */
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
.content {
|
|
50
|
-
width: 100%;
|
|
51
|
-
height: 100%;
|
|
52
|
-
background: linear-gradient(
|
|
53
|
-
45deg,
|
|
54
|
-
#f8f8f8 0%,
|
|
55
|
-
#e8e8e8 50%,
|
|
56
|
-
#d8d8d8 100%
|
|
57
|
-
);
|
|
58
|
-
position: relative;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
.drag-handle {
|
|
62
|
-
width: 60px;
|
|
63
|
-
height: 40px;
|
|
64
|
-
background: linear-gradient(135deg, #4a90e2 0%, #357abd 100%);
|
|
65
|
-
border: 2px solid #2c5aa0;
|
|
66
|
-
border-radius: 6px;
|
|
67
|
-
position: absolute;
|
|
68
|
-
cursor: grab;
|
|
69
|
-
display: flex;
|
|
70
|
-
align-items: center;
|
|
71
|
-
justify-content: center;
|
|
72
|
-
color: white;
|
|
73
|
-
font-weight: bold;
|
|
74
|
-
font-size: 10px;
|
|
75
|
-
text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.5);
|
|
76
|
-
box-shadow: 0 3px 6px rgba(0, 0, 0, 0.2);
|
|
77
|
-
transition: all 0.2s ease;
|
|
78
|
-
user-select: none;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
.drag-handle:hover {
|
|
82
|
-
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3);
|
|
83
|
-
transform: translateY(-1px);
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
.drag-handle[data-dragging] {
|
|
87
|
-
cursor: grabbing;
|
|
88
|
-
box-shadow: 0 6px 12px rgba(0, 0, 0, 0.4);
|
|
89
|
-
z-index: 1000;
|
|
90
|
-
transform: scale(1.05);
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
.target-element {
|
|
94
|
-
width: 120px;
|
|
95
|
-
height: 80px;
|
|
96
|
-
background: linear-gradient(135deg, #e74c3c 0%, #c0392b 100%);
|
|
97
|
-
border: 3px solid #a93226;
|
|
98
|
-
border-radius: 8px;
|
|
99
|
-
position: absolute;
|
|
100
|
-
display: flex;
|
|
101
|
-
align-items: center;
|
|
102
|
-
justify-content: center;
|
|
103
|
-
color: white;
|
|
104
|
-
font-weight: bold;
|
|
105
|
-
font-size: 12px;
|
|
106
|
-
text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.5);
|
|
107
|
-
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
|
|
108
|
-
transition: all 0.2s ease;
|
|
109
|
-
user-select: none;
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
.target-element[data-being-moved] {
|
|
113
|
-
box-shadow: 0 8px 16px rgba(0, 0, 0, 0.4);
|
|
114
|
-
z-index: 999;
|
|
115
|
-
transform: scale(1.02);
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
.obstacle {
|
|
119
|
-
background: linear-gradient(135deg, #95a5a6 0%, #7f8c8d 100%);
|
|
120
|
-
border: 2px solid #5d6d6e;
|
|
121
|
-
border-radius: 6px;
|
|
122
|
-
position: absolute;
|
|
123
|
-
display: flex;
|
|
124
|
-
align-items: center;
|
|
125
|
-
justify-content: center;
|
|
126
|
-
color: white;
|
|
127
|
-
font-weight: bold;
|
|
128
|
-
font-size: 11px;
|
|
129
|
-
text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.5);
|
|
130
|
-
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
|
|
131
|
-
user-select: none;
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
.info {
|
|
135
|
-
max-width: 900px;
|
|
136
|
-
margin: 0 auto;
|
|
137
|
-
padding: 20px;
|
|
138
|
-
background: white;
|
|
139
|
-
border-radius: 8px;
|
|
140
|
-
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
.info h1 {
|
|
144
|
-
margin-top: 0;
|
|
145
|
-
color: #333;
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
.info ul {
|
|
149
|
-
line-height: 1.6;
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
.debug-toggle {
|
|
153
|
-
margin: 20px auto;
|
|
154
|
-
text-align: center;
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
.debug-toggle label {
|
|
158
|
-
display: inline-flex;
|
|
159
|
-
align-items: center;
|
|
160
|
-
gap: 8px;
|
|
161
|
-
font-size: 14px;
|
|
162
|
-
color: #333;
|
|
163
|
-
cursor: pointer;
|
|
164
|
-
background: white;
|
|
165
|
-
padding: 10px 15px;
|
|
166
|
-
border-radius: 4px;
|
|
167
|
-
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
|
|
168
|
-
transition: all 0.2s ease;
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
.debug-toggle label:hover {
|
|
172
|
-
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15);
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
.debug-toggle input[type="checkbox"] {
|
|
176
|
-
width: 18px;
|
|
177
|
-
height: 18px;
|
|
178
|
-
cursor: pointer;
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
.position-display {
|
|
182
|
-
position: fixed;
|
|
183
|
-
top: 10px;
|
|
184
|
-
right: 10px;
|
|
185
|
-
background: rgba(0, 0, 0, 0.8);
|
|
186
|
-
color: white;
|
|
187
|
-
padding: 10px;
|
|
188
|
-
border-radius: 4px;
|
|
189
|
-
font-family: monospace;
|
|
190
|
-
font-size: 11px;
|
|
191
|
-
z-index: 10000;
|
|
192
|
-
line-height: 1.4;
|
|
193
|
-
min-width: 250px;
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
.position-display div {
|
|
197
|
-
margin: 2px 0;
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
.position-display .label {
|
|
201
|
-
font-weight: bold;
|
|
202
|
-
color: #ffeb3b;
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
.element-legend {
|
|
206
|
-
background: white;
|
|
207
|
-
padding: 15px;
|
|
208
|
-
border-radius: 6px;
|
|
209
|
-
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
|
|
210
|
-
margin: 20px auto;
|
|
211
|
-
max-width: 600px;
|
|
212
|
-
text-align: center;
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
.element-legend h4 {
|
|
216
|
-
margin: 0 0 15px 0;
|
|
217
|
-
font-size: 14px;
|
|
218
|
-
color: #333;
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
.legend-item {
|
|
222
|
-
display: inline-flex;
|
|
223
|
-
align-items: center;
|
|
224
|
-
gap: 8px;
|
|
225
|
-
margin: 0 15px 10px 0;
|
|
226
|
-
font-size: 12px;
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
.legend-color {
|
|
230
|
-
width: 30px;
|
|
231
|
-
height: 20px;
|
|
232
|
-
border-radius: 4px;
|
|
233
|
-
border: 2px solid #333;
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
.legend-handle {
|
|
237
|
-
background: linear-gradient(135deg, #4a90e2 0%, #357abd 100%);
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
.legend-target {
|
|
241
|
-
background: linear-gradient(135deg, #e74c3c 0%, #c0392b 100%);
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
.legend-obstacle {
|
|
245
|
-
background: linear-gradient(135deg, #95a5a6 0%, #7f8c8d 100%);
|
|
246
|
-
}
|
|
247
|
-
</style>
|
|
248
|
-
</head>
|
|
249
|
-
<body>
|
|
250
|
-
<div class="info">
|
|
251
|
-
<h1>Drag Gesture Demo - elementToImpact</h1>
|
|
252
|
-
<p>
|
|
253
|
-
This demo demonstrates the <code>elementToImpact</code> feature where
|
|
254
|
-
you can drag from one element but actually move a different element:
|
|
255
|
-
</p>
|
|
256
|
-
<ul>
|
|
257
|
-
<li>
|
|
258
|
-
<strong>Blue handles:</strong> The elements you grab and drag from
|
|
259
|
-
</li>
|
|
260
|
-
<li>
|
|
261
|
-
<strong>Red targets:</strong> The elements that actually move when you
|
|
262
|
-
drag the handles
|
|
263
|
-
</li>
|
|
264
|
-
<li>
|
|
265
|
-
<strong>Gray obstacles:</strong> Static elements that provide
|
|
266
|
-
collision constraints
|
|
267
|
-
</li>
|
|
268
|
-
<li>
|
|
269
|
-
<strong>Key concept:</strong> Obstacles and frontiers are calculated
|
|
270
|
-
based on the target element's position, not the handle
|
|
271
|
-
</li>
|
|
272
|
-
<li>
|
|
273
|
-
<strong>Try it:</strong> Drag the blue handles and watch how the red
|
|
274
|
-
targets move while respecting obstacles
|
|
275
|
-
</li>
|
|
276
|
-
</ul>
|
|
277
|
-
</div>
|
|
278
|
-
|
|
279
|
-
<div class="debug-toggle">
|
|
280
|
-
<label>
|
|
281
|
-
<input type="checkbox" id="debugMarkersCheckbox" checked />
|
|
282
|
-
Show Debug Markers
|
|
283
|
-
</label>
|
|
284
|
-
</div>
|
|
285
|
-
|
|
286
|
-
<div class="element-legend">
|
|
287
|
-
<h4>Element Types</h4>
|
|
288
|
-
<div class="legend-item">
|
|
289
|
-
<div class="legend-color legend-handle"></div>
|
|
290
|
-
<span>Drag Handle (grab from here)</span>
|
|
291
|
-
</div>
|
|
292
|
-
<div class="legend-item">
|
|
293
|
-
<div class="legend-color legend-target"></div>
|
|
294
|
-
<span>Target Element (moves)</span>
|
|
295
|
-
</div>
|
|
296
|
-
<div class="legend-item">
|
|
297
|
-
<div class="legend-color legend-obstacle"></div>
|
|
298
|
-
<span>Obstacle (collision)</span>
|
|
299
|
-
</div>
|
|
300
|
-
</div>
|
|
301
|
-
|
|
302
|
-
<!-- Demo: Basic Handle → Target -->
|
|
303
|
-
<div class="demo-section">
|
|
304
|
-
<h2 class="demo-title">
|
|
305
|
-
Demo: Basic Handle → Target (drag blue handle to move red target)
|
|
306
|
-
</h2>
|
|
307
|
-
<div class="container" id="demoContainer">
|
|
308
|
-
<div class="content">
|
|
309
|
-
<!-- Drag handle positioned separately from target -->
|
|
310
|
-
<div class="drag-handle" id="handle1" style="left: 50px; top: 50px">
|
|
311
|
-
HANDLE
|
|
312
|
-
</div>
|
|
313
|
-
|
|
314
|
-
<!-- Target element that actually moves -->
|
|
315
|
-
<div
|
|
316
|
-
class="target-element"
|
|
317
|
-
id="target1"
|
|
318
|
-
style="left: 200px; top: 100px"
|
|
319
|
-
>
|
|
320
|
-
TARGET
|
|
321
|
-
</div>
|
|
322
|
-
|
|
323
|
-
<!-- Obstacles for collision detection -->
|
|
324
|
-
<div
|
|
325
|
-
class="obstacle"
|
|
326
|
-
data-drag-obstacle="demo"
|
|
327
|
-
style="left: 350px; top: 120px; width: 80px; height: 60px"
|
|
328
|
-
>
|
|
329
|
-
OBSTACLE 1
|
|
330
|
-
</div>
|
|
331
|
-
|
|
332
|
-
<div
|
|
333
|
-
class="obstacle"
|
|
334
|
-
data-drag-obstacle="demo"
|
|
335
|
-
style="left: 500px; top: 200px; width: 100px; height: 80px"
|
|
336
|
-
>
|
|
337
|
-
OBSTACLE 2
|
|
338
|
-
</div>
|
|
339
|
-
|
|
340
|
-
<div
|
|
341
|
-
class="obstacle"
|
|
342
|
-
data-drag-obstacle="demo"
|
|
343
|
-
style="left: 150px; top: 300px; width: 120px; height: 60px"
|
|
344
|
-
>
|
|
345
|
-
OBSTACLE 3
|
|
346
|
-
</div>
|
|
347
|
-
</div>
|
|
348
|
-
</div>
|
|
349
|
-
</div>
|
|
350
|
-
|
|
351
|
-
<!-- Position Display -->
|
|
352
|
-
<div class="position-display" id="positionDisplay">
|
|
353
|
-
<div class="label">Drag Position Info</div>
|
|
354
|
-
<div id="demo1Info">Demo: Not dragging</div>
|
|
355
|
-
<div id="elementInfo">Elements: Hover to see info</div>
|
|
356
|
-
</div>
|
|
357
|
-
|
|
358
|
-
<script type="module">
|
|
359
|
-
import { createDragToMoveGestureController } from "@jsenv/dom";
|
|
360
|
-
|
|
361
|
-
const demo1Info = document.getElementById("demo1Info");
|
|
362
|
-
const elementInfo = document.getElementById("elementInfo");
|
|
363
|
-
|
|
364
|
-
// Demo 1: Basic Handle → Target
|
|
365
|
-
const handle1 = document.getElementById("handle1");
|
|
366
|
-
const target1 = document.getElementById("target1");
|
|
367
|
-
|
|
368
|
-
handle1.addEventListener("mousedown", (event) => {
|
|
369
|
-
console.log("Demo 1 - Handle drag started");
|
|
370
|
-
|
|
371
|
-
createDragToMoveGestureController({
|
|
372
|
-
name: "demo",
|
|
373
|
-
backdrop: false,
|
|
374
|
-
obstacleAttributeName: "data-drag-obstacle",
|
|
375
|
-
onGrab: (gestureInfo) => {
|
|
376
|
-
console.log("Demo 1 - Grab started", gestureInfo);
|
|
377
|
-
handle1.setAttribute("data-dragging", "");
|
|
378
|
-
target1.setAttribute("data-being-moved", "");
|
|
379
|
-
updateDemo1Info(gestureInfo, "Grabbed");
|
|
380
|
-
},
|
|
381
|
-
onDragStart: (gestureInfo) => {
|
|
382
|
-
console.log("Demo 1 - Drag started", gestureInfo);
|
|
383
|
-
updateDemo1Info(gestureInfo, "Drag Start");
|
|
384
|
-
},
|
|
385
|
-
onDrag: (gestureInfo, phase) => {
|
|
386
|
-
updateDemo1Info(gestureInfo, `Dragging (${phase})`);
|
|
387
|
-
},
|
|
388
|
-
onRelease: (gestureInfo) => {
|
|
389
|
-
console.log("Demo 1 - Drag released", gestureInfo);
|
|
390
|
-
handle1.removeAttribute("data-dragging");
|
|
391
|
-
target1.removeAttribute("data-being-moved");
|
|
392
|
-
updateDemo1Info(gestureInfo, "Released");
|
|
393
|
-
},
|
|
394
|
-
}).grabViaMouse(event, {
|
|
395
|
-
element: handle1,
|
|
396
|
-
elementToImpact: target1, // The key feature: drag handle1 but move target1
|
|
397
|
-
});
|
|
398
|
-
});
|
|
399
|
-
|
|
400
|
-
function updateDemo1Info(gestureInfo, status) {
|
|
401
|
-
const handleRect = handle1.getBoundingClientRect();
|
|
402
|
-
const targetRect = target1.getBoundingClientRect();
|
|
403
|
-
|
|
404
|
-
const handleX = handleRect.left + window.scrollX;
|
|
405
|
-
const targetX = targetRect.left + window.scrollX;
|
|
406
|
-
const targetY = targetRect.top + window.scrollY;
|
|
407
|
-
|
|
408
|
-
demo1Info.innerHTML = `Demo: ${status} | Handle: ${Math.round(handleX)}px | Target: ${Math.round(targetX)}, ${Math.round(targetY)}px`;
|
|
409
|
-
}
|
|
410
|
-
|
|
411
|
-
// Add hover effects to show element information
|
|
412
|
-
[handle1, target1].forEach((element) => {
|
|
413
|
-
element.addEventListener("mouseenter", () => {
|
|
414
|
-
const type = element.classList.contains("drag-handle")
|
|
415
|
-
? "Handle"
|
|
416
|
-
: "Target";
|
|
417
|
-
const id = element.id;
|
|
418
|
-
elementInfo.textContent = `${type}: ${id} (${element.textContent})`;
|
|
419
|
-
});
|
|
420
|
-
|
|
421
|
-
element.addEventListener("mouseleave", () => {
|
|
422
|
-
elementInfo.textContent = "Elements: Hover to see info";
|
|
423
|
-
});
|
|
424
|
-
});
|
|
425
|
-
|
|
426
|
-
// Initial position updates
|
|
427
|
-
function updatePositions() {
|
|
428
|
-
if (!handle1.hasAttribute("data-dragging")) {
|
|
429
|
-
const handleRect = handle1.getBoundingClientRect();
|
|
430
|
-
const targetRect = target1.getBoundingClientRect();
|
|
431
|
-
|
|
432
|
-
const handleX = handleRect.left + window.scrollX;
|
|
433
|
-
const targetX = targetRect.left + window.scrollX;
|
|
434
|
-
const targetY = targetRect.top + window.scrollY;
|
|
435
|
-
|
|
436
|
-
demo1Info.innerHTML = `Demo: Ready | Handle: ${Math.round(handleX)}px | Target: ${Math.round(targetX)}, ${Math.round(targetY)}px`;
|
|
437
|
-
}
|
|
438
|
-
}
|
|
439
|
-
|
|
440
|
-
// Update positions on scroll
|
|
441
|
-
document.addEventListener("scroll", updatePositions);
|
|
442
|
-
updatePositions();
|
|
443
|
-
</script>
|
|
444
|
-
</body>
|
|
445
|
-
</html>
|