@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,517 +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>Document Auto-Scroll Demo</title>
|
|
7
|
-
<style>
|
|
8
|
-
body {
|
|
9
|
-
margin: 0;
|
|
10
|
-
padding: 20px;
|
|
11
|
-
font-family: Arial, sans-serif;
|
|
12
|
-
background: #f0f0f0;
|
|
13
|
-
min-height: 300vh; /* Make page tall enough to scroll */
|
|
14
|
-
min-width: 200vw;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
.demo-header {
|
|
18
|
-
background: white;
|
|
19
|
-
padding: 20px;
|
|
20
|
-
border-radius: 8px;
|
|
21
|
-
margin-bottom: 20px;
|
|
22
|
-
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
.demo-title {
|
|
26
|
-
margin: 0 0 10px 0;
|
|
27
|
-
font-size: 24px;
|
|
28
|
-
color: #333;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
.demo-description {
|
|
32
|
-
margin: 0;
|
|
33
|
-
color: #666;
|
|
34
|
-
line-height: 1.5;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
.draggable-element {
|
|
38
|
-
width: 120px;
|
|
39
|
-
height: 80px;
|
|
40
|
-
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
|
41
|
-
border: 10px solid #333;
|
|
42
|
-
/* border-radius: 12px; */
|
|
43
|
-
cursor: grab;
|
|
44
|
-
display: flex;
|
|
45
|
-
align-items: center;
|
|
46
|
-
justify-content: center;
|
|
47
|
-
color: white;
|
|
48
|
-
font-weight: bold;
|
|
49
|
-
text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.5);
|
|
50
|
-
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
|
|
51
|
-
transition: box-shadow 0.2s ease;
|
|
52
|
-
z-index: 1000;
|
|
53
|
-
user-select: none;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
.draggable-element:hover {
|
|
57
|
-
box-shadow: 0 6px 16px rgba(0, 0, 0, 0.4);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
.draggable-element[data-dragging] {
|
|
61
|
-
cursor: grabbing;
|
|
62
|
-
box-shadow: 0 8px 20px rgba(0, 0, 0, 0.5);
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
.content-section {
|
|
66
|
-
background: white;
|
|
67
|
-
margin: 40px 0;
|
|
68
|
-
padding: 40px;
|
|
69
|
-
border-radius: 8px;
|
|
70
|
-
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
|
|
71
|
-
text-align: center;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
.content-section:nth-child(even) {
|
|
75
|
-
background: linear-gradient(135deg, #e3f2fd, #bbdefb);
|
|
76
|
-
color: #1976d2;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
.content-section:nth-child(odd) {
|
|
80
|
-
background: linear-gradient(135deg, #f3e5f5, #ce93d8);
|
|
81
|
-
color: #7b1fa2;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
.scroll-indicator {
|
|
85
|
-
position: fixed;
|
|
86
|
-
top: 10px;
|
|
87
|
-
right: 10px;
|
|
88
|
-
background: rgba(0, 0, 0, 0.8);
|
|
89
|
-
color: white;
|
|
90
|
-
padding: 10px;
|
|
91
|
-
border-radius: 4px;
|
|
92
|
-
font-family: monospace;
|
|
93
|
-
font-size: 12px;
|
|
94
|
-
z-index: 2000;
|
|
95
|
-
}
|
|
96
|
-
</style>
|
|
97
|
-
</head>
|
|
98
|
-
<body>
|
|
99
|
-
<div class="demo-header">
|
|
100
|
-
<h1 class="demo-title">Document Auto-Scroll Demo</h1>
|
|
101
|
-
<p class="demo-description">
|
|
102
|
-
This demo tests document auto-scrolling behavior when dragging an
|
|
103
|
-
element.
|
|
104
|
-
<br /><strong>Instructions:</strong> Drag the purple element near the
|
|
105
|
-
top or bottom edges of the viewport to trigger auto-scrolling. <br />The
|
|
106
|
-
document itself is the scrollable parent, so scrolling should work
|
|
107
|
-
throughout the entire page.
|
|
108
|
-
</p>
|
|
109
|
-
</div>
|
|
110
|
-
|
|
111
|
-
<div
|
|
112
|
-
data-draggable
|
|
113
|
-
class="draggable-element"
|
|
114
|
-
style="position: absolute; left: 300px"
|
|
115
|
-
>
|
|
116
|
-
Drag Me
|
|
117
|
-
</div>
|
|
118
|
-
|
|
119
|
-
<div style="position: relative; inset: 0; left: 350px; top: 100px">
|
|
120
|
-
<div class="draggable-element" data-draggable style="position: absolute">
|
|
121
|
-
Drag Me (custom positioned parent)
|
|
122
|
-
</div>
|
|
123
|
-
</div>
|
|
124
|
-
|
|
125
|
-
<!-- Programmatic Controls -->
|
|
126
|
-
<div
|
|
127
|
-
style="
|
|
128
|
-
background: white;
|
|
129
|
-
padding: 15px;
|
|
130
|
-
border-radius: 8px;
|
|
131
|
-
margin-bottom: 20px;
|
|
132
|
-
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
|
|
133
|
-
max-width: 300px;
|
|
134
|
-
"
|
|
135
|
-
>
|
|
136
|
-
<h3 style="margin: 0 0 15px 0; font-size: 16px; color: #333">
|
|
137
|
-
Programmatic Controls
|
|
138
|
-
</h3>
|
|
139
|
-
<div style="display: flex; flex-direction: column; gap: 8px">
|
|
140
|
-
<button
|
|
141
|
-
id="grabBtn"
|
|
142
|
-
style="
|
|
143
|
-
padding: 10px 15px;
|
|
144
|
-
background: #4caf50;
|
|
145
|
-
color: white;
|
|
146
|
-
border: none;
|
|
147
|
-
border-radius: 4px;
|
|
148
|
-
cursor: pointer;
|
|
149
|
-
font-size: 14px;
|
|
150
|
-
font-weight: bold;
|
|
151
|
-
"
|
|
152
|
-
>
|
|
153
|
-
Grab Element
|
|
154
|
-
</button>
|
|
155
|
-
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 8px">
|
|
156
|
-
<button
|
|
157
|
-
id="dragLeftBtn"
|
|
158
|
-
disabled
|
|
159
|
-
style="
|
|
160
|
-
padding: 8px 12px;
|
|
161
|
-
background: #9c27b0;
|
|
162
|
-
color: white;
|
|
163
|
-
border: none;
|
|
164
|
-
border-radius: 4px;
|
|
165
|
-
cursor: pointer;
|
|
166
|
-
font-size: 12px;
|
|
167
|
-
opacity: 0.5;
|
|
168
|
-
"
|
|
169
|
-
>
|
|
170
|
-
← Left
|
|
171
|
-
</button>
|
|
172
|
-
<button
|
|
173
|
-
id="dragRightBtn"
|
|
174
|
-
disabled
|
|
175
|
-
style="
|
|
176
|
-
padding: 8px 12px;
|
|
177
|
-
background: #2196f3;
|
|
178
|
-
color: white;
|
|
179
|
-
border: none;
|
|
180
|
-
border-radius: 4px;
|
|
181
|
-
cursor: pointer;
|
|
182
|
-
font-size: 12px;
|
|
183
|
-
opacity: 0.5;
|
|
184
|
-
"
|
|
185
|
-
>
|
|
186
|
-
Right →
|
|
187
|
-
</button>
|
|
188
|
-
<button
|
|
189
|
-
id="dragUpBtn"
|
|
190
|
-
disabled
|
|
191
|
-
style="
|
|
192
|
-
padding: 8px 12px;
|
|
193
|
-
background: #607d8b;
|
|
194
|
-
color: white;
|
|
195
|
-
border: none;
|
|
196
|
-
border-radius: 4px;
|
|
197
|
-
cursor: pointer;
|
|
198
|
-
font-size: 12px;
|
|
199
|
-
opacity: 0.5;
|
|
200
|
-
"
|
|
201
|
-
>
|
|
202
|
-
↑ Up
|
|
203
|
-
</button>
|
|
204
|
-
<button
|
|
205
|
-
id="dragDownBtn"
|
|
206
|
-
disabled
|
|
207
|
-
style="
|
|
208
|
-
padding: 8px 12px;
|
|
209
|
-
background: #ff9800;
|
|
210
|
-
color: white;
|
|
211
|
-
border: none;
|
|
212
|
-
border-radius: 4px;
|
|
213
|
-
cursor: pointer;
|
|
214
|
-
font-size: 12px;
|
|
215
|
-
opacity: 0.5;
|
|
216
|
-
"
|
|
217
|
-
>
|
|
218
|
-
↓ Down
|
|
219
|
-
</button>
|
|
220
|
-
</div>
|
|
221
|
-
<button
|
|
222
|
-
id="releaseBtn"
|
|
223
|
-
disabled
|
|
224
|
-
style="
|
|
225
|
-
padding: 10px 15px;
|
|
226
|
-
background: #f44336;
|
|
227
|
-
color: white;
|
|
228
|
-
border: none;
|
|
229
|
-
border-radius: 4px;
|
|
230
|
-
cursor: pointer;
|
|
231
|
-
font-size: 14px;
|
|
232
|
-
font-weight: bold;
|
|
233
|
-
opacity: 0.5;
|
|
234
|
-
"
|
|
235
|
-
>
|
|
236
|
-
Release Element
|
|
237
|
-
</button>
|
|
238
|
-
</div>
|
|
239
|
-
<div
|
|
240
|
-
id="status"
|
|
241
|
-
style="
|
|
242
|
-
margin-top: 15px;
|
|
243
|
-
padding: 10px;
|
|
244
|
-
background: #f9f9f9;
|
|
245
|
-
border-radius: 4px;
|
|
246
|
-
font-family: monospace;
|
|
247
|
-
font-size: 12px;
|
|
248
|
-
color: #666;
|
|
249
|
-
border-left: 4px solid #2196f3;
|
|
250
|
-
"
|
|
251
|
-
>
|
|
252
|
-
Ready - Click "Grab Element" to start programmatic control
|
|
253
|
-
</div>
|
|
254
|
-
</div>
|
|
255
|
-
|
|
256
|
-
<div
|
|
257
|
-
data-drag-obstacle
|
|
258
|
-
style="
|
|
259
|
-
position: absolute;
|
|
260
|
-
left: 100px;
|
|
261
|
-
top: 450px;
|
|
262
|
-
background: red;
|
|
263
|
-
width: 50px;
|
|
264
|
-
height: 50px;
|
|
265
|
-
"
|
|
266
|
-
>
|
|
267
|
-
absolute
|
|
268
|
-
</div>
|
|
269
|
-
|
|
270
|
-
<div
|
|
271
|
-
data-drag-obstacle
|
|
272
|
-
style="
|
|
273
|
-
position: fixed;
|
|
274
|
-
left: 280px;
|
|
275
|
-
top: 100px;
|
|
276
|
-
background: violet;
|
|
277
|
-
width: 50px;
|
|
278
|
-
height: 50px;
|
|
279
|
-
"
|
|
280
|
-
>
|
|
281
|
-
fixed
|
|
282
|
-
</div>
|
|
283
|
-
|
|
284
|
-
<div
|
|
285
|
-
data-drag-obstacle
|
|
286
|
-
style="
|
|
287
|
-
position: sticky;
|
|
288
|
-
left: 280px;
|
|
289
|
-
top: 300px;
|
|
290
|
-
background: green;
|
|
291
|
-
width: 50px;
|
|
292
|
-
height: 50px;
|
|
293
|
-
"
|
|
294
|
-
>
|
|
295
|
-
sticky
|
|
296
|
-
</div>
|
|
297
|
-
|
|
298
|
-
<div class="scroll-indicator" id="scrollIndicator">Scroll: 0px</div>
|
|
299
|
-
|
|
300
|
-
<div class="content-section">
|
|
301
|
-
<h2>Section 1</h2>
|
|
302
|
-
<p>
|
|
303
|
-
Drag the element above towards the top edge of your viewport to test
|
|
304
|
-
upward auto-scrolling.
|
|
305
|
-
</p>
|
|
306
|
-
</div>
|
|
307
|
-
|
|
308
|
-
<div class="content-section">
|
|
309
|
-
<h2>Section 2</h2>
|
|
310
|
-
<p>
|
|
311
|
-
This is some content to make the page scrollable. Keep dragging down to
|
|
312
|
-
test auto-scroll behavior.
|
|
313
|
-
</p>
|
|
314
|
-
</div>
|
|
315
|
-
|
|
316
|
-
<div class="content-section">
|
|
317
|
-
<h2>Section 3</h2>
|
|
318
|
-
<p>
|
|
319
|
-
More content for testing. Drag the element near the bottom edge to
|
|
320
|
-
trigger downward scrolling.
|
|
321
|
-
</p>
|
|
322
|
-
</div>
|
|
323
|
-
|
|
324
|
-
<div class="content-section">
|
|
325
|
-
<h2>Section 4</h2>
|
|
326
|
-
<p>
|
|
327
|
-
Continue testing the auto-scroll behavior as you drag near viewport
|
|
328
|
-
edges.
|
|
329
|
-
</p>
|
|
330
|
-
</div>
|
|
331
|
-
|
|
332
|
-
<div class="content-section">
|
|
333
|
-
<h2>Section 5</h2>
|
|
334
|
-
<p>
|
|
335
|
-
Final section. The auto-scroll should work smoothly in both directions.
|
|
336
|
-
</p>
|
|
337
|
-
</div>
|
|
338
|
-
|
|
339
|
-
<script type="module">
|
|
340
|
-
import { createDragToMoveGestureController } from "@jsenv/dom";
|
|
341
|
-
|
|
342
|
-
const draggableElements = document.querySelectorAll("[data-draggable]");
|
|
343
|
-
const dragElement = draggableElements[0];
|
|
344
|
-
for (const draggable of draggableElements) {
|
|
345
|
-
draggable.onpointerdown = (e) => {
|
|
346
|
-
// Set up the manual drag behavior
|
|
347
|
-
manualDragGestureController.grabViaPointer(e, {
|
|
348
|
-
element: draggable,
|
|
349
|
-
onStart: () => {
|
|
350
|
-
draggable.setAttribute("data-dragging", "");
|
|
351
|
-
updateStatus(
|
|
352
|
-
"Manual drag started - document auto-scroll enabled",
|
|
353
|
-
);
|
|
354
|
-
},
|
|
355
|
-
onEnd: () => {
|
|
356
|
-
draggable.removeAttribute("data-dragging");
|
|
357
|
-
updateStatus("Manual drag ended");
|
|
358
|
-
},
|
|
359
|
-
});
|
|
360
|
-
};
|
|
361
|
-
}
|
|
362
|
-
|
|
363
|
-
const scrollIndicator = document.getElementById("scrollIndicator");
|
|
364
|
-
|
|
365
|
-
// Update scroll indicator
|
|
366
|
-
const updateScrollIndicator = () => {
|
|
367
|
-
const scrollY = window.scrollY || document.documentElement.scrollTop;
|
|
368
|
-
scrollIndicator.textContent = `Scroll: ${Math.round(scrollY)}px`;
|
|
369
|
-
};
|
|
370
|
-
|
|
371
|
-
// Initialize scroll indicator
|
|
372
|
-
updateScrollIndicator();
|
|
373
|
-
window.addEventListener("scroll", updateScrollIndicator);
|
|
374
|
-
|
|
375
|
-
// Manual drag gesture (mouse-based)
|
|
376
|
-
const manualDragGestureController = createDragToMoveGestureController({
|
|
377
|
-
threshold: 0,
|
|
378
|
-
areaConstraint: "scroll",
|
|
379
|
-
});
|
|
380
|
-
|
|
381
|
-
// Programmatic Controls
|
|
382
|
-
const controls = {
|
|
383
|
-
grabBtn: document.getElementById("grabBtn"),
|
|
384
|
-
dragLeftBtn: document.getElementById("dragLeftBtn"),
|
|
385
|
-
dragRightBtn: document.getElementById("dragRightBtn"),
|
|
386
|
-
dragUpBtn: document.getElementById("dragUpBtn"),
|
|
387
|
-
dragDownBtn: document.getElementById("dragDownBtn"),
|
|
388
|
-
releaseBtn: document.getElementById("releaseBtn"),
|
|
389
|
-
statusDiv: document.getElementById("status"),
|
|
390
|
-
dragGesture: null,
|
|
391
|
-
};
|
|
392
|
-
|
|
393
|
-
function updateStatus(message) {
|
|
394
|
-
controls.statusDiv.textContent = message;
|
|
395
|
-
console.log("Document Auto-Scroll Demo:", message);
|
|
396
|
-
}
|
|
397
|
-
|
|
398
|
-
function updateButtonStates(grabbed = false) {
|
|
399
|
-
controls.grabBtn.disabled = grabbed;
|
|
400
|
-
controls.dragLeftBtn.disabled = !grabbed;
|
|
401
|
-
controls.dragRightBtn.disabled = !grabbed;
|
|
402
|
-
controls.dragUpBtn.disabled = !grabbed;
|
|
403
|
-
controls.dragDownBtn.disabled = !grabbed;
|
|
404
|
-
controls.releaseBtn.disabled = !grabbed;
|
|
405
|
-
|
|
406
|
-
// Update visual disabled state
|
|
407
|
-
const dragButtons = [
|
|
408
|
-
controls.dragLeftBtn,
|
|
409
|
-
controls.dragRightBtn,
|
|
410
|
-
controls.dragUpBtn,
|
|
411
|
-
controls.dragDownBtn,
|
|
412
|
-
controls.releaseBtn,
|
|
413
|
-
];
|
|
414
|
-
dragButtons.forEach((btn) => {
|
|
415
|
-
btn.style.opacity = grabbed ? "1" : "0.5";
|
|
416
|
-
btn.style.cursor = grabbed ? "pointer" : "not-allowed";
|
|
417
|
-
});
|
|
418
|
-
|
|
419
|
-
controls.grabBtn.style.opacity = grabbed ? "0.5" : "1";
|
|
420
|
-
controls.grabBtn.style.cursor = grabbed ? "not-allowed" : "pointer";
|
|
421
|
-
}
|
|
422
|
-
|
|
423
|
-
// Grab button
|
|
424
|
-
controls.grabBtn.addEventListener("click", () => {
|
|
425
|
-
if (controls.dragGesture) return;
|
|
426
|
-
|
|
427
|
-
const dragOptions = {
|
|
428
|
-
threshold: 0,
|
|
429
|
-
backdrop: false,
|
|
430
|
-
onGrab: (gestureInfo) => {
|
|
431
|
-
updateStatus("Element grabbed programmatically - ready to drag");
|
|
432
|
-
console.log("Programmatic grab:", gestureInfo);
|
|
433
|
-
},
|
|
434
|
-
onDragStart: (gestureInfo) => {
|
|
435
|
-
updateStatus("Programmatic drag started with document auto-scroll");
|
|
436
|
-
dragElement.setAttribute("data-dragging", "");
|
|
437
|
-
console.log("Programmatic drag start:", gestureInfo);
|
|
438
|
-
},
|
|
439
|
-
onDrag: (gestureInfo, phase) => {
|
|
440
|
-
updateStatus(
|
|
441
|
-
`Dragging programmatically (${phase}) - auto-scroll active`,
|
|
442
|
-
);
|
|
443
|
-
console.log("Programmatic drag:", gestureInfo, phase);
|
|
444
|
-
},
|
|
445
|
-
onRelease: (gestureInfo) => {
|
|
446
|
-
updateStatus("Programmatic drag released");
|
|
447
|
-
dragElement.removeAttribute("data-dragging");
|
|
448
|
-
console.log("Programmatic release:", gestureInfo);
|
|
449
|
-
controls.dragGestureController = null;
|
|
450
|
-
controls.dragInstance = null;
|
|
451
|
-
updateButtonStates(false);
|
|
452
|
-
},
|
|
453
|
-
};
|
|
454
|
-
|
|
455
|
-
controls.dragGestureController =
|
|
456
|
-
createDragToMoveGestureController(dragOptions);
|
|
457
|
-
controls.dragGesture = controls.dragGestureController.grab({
|
|
458
|
-
element: dragElement,
|
|
459
|
-
});
|
|
460
|
-
|
|
461
|
-
updateButtonStates(true);
|
|
462
|
-
});
|
|
463
|
-
|
|
464
|
-
// Drag direction buttons
|
|
465
|
-
controls.dragLeftBtn.addEventListener("click", () => {
|
|
466
|
-
if (!controls.dragGesture) return;
|
|
467
|
-
const currentGestureInfo = controls.dragGesture.gestureInfo;
|
|
468
|
-
const newX = currentGestureInfo.moveX - 100;
|
|
469
|
-
updateStatus("Dragging left by 100px - testing document auto-scroll");
|
|
470
|
-
controls.dragGesture.drag(newX, undefined);
|
|
471
|
-
});
|
|
472
|
-
|
|
473
|
-
controls.dragRightBtn.addEventListener("click", () => {
|
|
474
|
-
if (!controls.dragGesture) return;
|
|
475
|
-
const currentGestureInfo = controls.dragGesture.gestureInfo;
|
|
476
|
-
const newX = currentGestureInfo.moveX + 100;
|
|
477
|
-
updateStatus("Dragging right by 100px - testing document auto-scroll");
|
|
478
|
-
controls.dragGesture.drag(newX, undefined);
|
|
479
|
-
});
|
|
480
|
-
|
|
481
|
-
controls.dragUpBtn.addEventListener("click", () => {
|
|
482
|
-
if (!controls.dragGesture) return;
|
|
483
|
-
const currentGestureInfo = controls.dragGesture.gestureInfo;
|
|
484
|
-
const newY = currentGestureInfo.moveY - 100;
|
|
485
|
-
updateStatus("Dragging up by 100px - testing upward auto-scroll");
|
|
486
|
-
controls.dragGesture.drag(undefined, newY);
|
|
487
|
-
});
|
|
488
|
-
|
|
489
|
-
controls.dragDownBtn.addEventListener("click", () => {
|
|
490
|
-
if (!controls.dragGesture) return;
|
|
491
|
-
const currentGestureInfo = controls.dragGesture.gestureInfo;
|
|
492
|
-
const newY = currentGestureInfo.moveY + 100;
|
|
493
|
-
updateStatus("Dragging down by 100px - testing downward auto-scroll");
|
|
494
|
-
controls.dragGesture.drag(undefined, newY);
|
|
495
|
-
});
|
|
496
|
-
|
|
497
|
-
// Release button
|
|
498
|
-
controls.releaseBtn.addEventListener("click", () => {
|
|
499
|
-
if (!controls.dragGesture) return;
|
|
500
|
-
updateStatus("Releasing programmatic drag");
|
|
501
|
-
controls.dragGesture.release();
|
|
502
|
-
});
|
|
503
|
-
|
|
504
|
-
// Initialize
|
|
505
|
-
updateButtonStates(false);
|
|
506
|
-
console.log(
|
|
507
|
-
"Document auto-scroll demo with programmatic controls initialized",
|
|
508
|
-
);
|
|
509
|
-
|
|
510
|
-
document.addEventListener("DOMContentLoaded", () => {
|
|
511
|
-
setTimeout(() => {
|
|
512
|
-
window.scrollTo(100, 0);
|
|
513
|
-
}, 200);
|
|
514
|
-
});
|
|
515
|
-
</script>
|
|
516
|
-
</body>
|
|
517
|
-
</html>
|