@p4ulcristian/iris-layout 0.2.5 → 0.2.6
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/cljs-runtime/iris_layout.components.entity_tile.js +121 -89
- package/dist/cljs-runtime/iris_layout.components.entity_tile.js.map +1 -1
- package/dist/cljs-runtime/iris_layout.components.entity_tile_group.js +9 -9
- package/dist/cljs-runtime/iris_layout.components.entity_tile_group.js.map +1 -1
- package/dist/cljs-runtime/iris_layout.components.touch_drag.js +134 -148
- package/dist/cljs-runtime/iris_layout.components.touch_drag.js.map +1 -1
- package/dist/cljs-runtime/iris_layout.core.js +310 -806
- package/dist/cljs-runtime/iris_layout.core.js.map +1 -1
- package/dist/iris-layout.js +55 -53
- package/package.json +1 -1
|
@@ -2,8 +2,7 @@ import "./cljs_env.js";
|
|
|
2
2
|
import "./cljs.core.js";
|
|
3
3
|
import "./reagent.core.js";
|
|
4
4
|
goog.provide('iris_layout.components.touch_drag');
|
|
5
|
-
iris_layout.components.touch_drag.
|
|
6
|
-
iris_layout.components.touch_drag.move_tolerance = (10);
|
|
5
|
+
iris_layout.components.touch_drag.move_threshold = (8);
|
|
7
6
|
if((typeof iris_layout !== 'undefined') && (typeof iris_layout.components !== 'undefined') && (typeof iris_layout.components.touch_drag !== 'undefined') && (typeof iris_layout.components.touch_drag.touch_state !== 'undefined')){
|
|
8
7
|
} else {
|
|
9
8
|
iris_layout.components.touch_drag.touch_state = reagent.core.atom.cljs$core$IFn$_invoke$arity$1(null);
|
|
@@ -16,15 +15,19 @@ if((typeof iris_layout !== 'undefined') && (typeof iris_layout.components !== 'u
|
|
|
16
15
|
} else {
|
|
17
16
|
iris_layout.components.touch_drag.nav_edge_target = reagent.core.atom.cljs$core$IFn$_invoke$arity$1(null);
|
|
18
17
|
}
|
|
19
|
-
if((typeof iris_layout !== 'undefined') && (typeof iris_layout.components !== 'undefined') && (typeof iris_layout.components.touch_drag !== 'undefined') && (typeof iris_layout.components.touch_drag.
|
|
18
|
+
if((typeof iris_layout !== 'undefined') && (typeof iris_layout.components !== 'undefined') && (typeof iris_layout.components.touch_drag !== 'undefined') && (typeof iris_layout.components.touch_drag.drop_result !== 'undefined')){
|
|
20
19
|
} else {
|
|
21
|
-
iris_layout.components.touch_drag.
|
|
20
|
+
iris_layout.components.touch_drag.drop_result = reagent.core.atom.cljs$core$IFn$_invoke$arity$1(null);
|
|
21
|
+
}
|
|
22
|
+
if((typeof iris_layout !== 'undefined') && (typeof iris_layout.components !== 'undefined') && (typeof iris_layout.components.touch_drag !== 'undefined') && (typeof iris_layout.components.touch_drag.touch_start !== 'undefined')){
|
|
23
|
+
} else {
|
|
24
|
+
iris_layout.components.touch_drag.touch_start = cljs.core.atom.cljs$core$IFn$_invoke$arity$1(null);
|
|
22
25
|
}
|
|
23
26
|
iris_layout.components.touch_drag.dragging_QMARK_ = (function iris_layout$components$touch_drag$dragging_QMARK_(){
|
|
24
27
|
return (!((cljs.core.deref(iris_layout.components.touch_drag.touch_state) == null)));
|
|
25
28
|
});
|
|
26
|
-
iris_layout.components.touch_drag.
|
|
27
|
-
return (!((cljs.core.deref(iris_layout.components.touch_drag.
|
|
29
|
+
iris_layout.components.touch_drag.touch_started_QMARK_ = (function iris_layout$components$touch_drag$touch_started_QMARK_(){
|
|
30
|
+
return (!((cljs.core.deref(iris_layout.components.touch_drag.touch_start) == null)));
|
|
28
31
|
});
|
|
29
32
|
iris_layout.components.touch_drag.create_ghost_BANG_ = (function iris_layout$components$touch_drag$create_ghost_BANG_(x,y){
|
|
30
33
|
var ghost = document.createElement("div");
|
|
@@ -37,67 +40,38 @@ document.body.appendChild(ghost);
|
|
|
37
40
|
return ghost;
|
|
38
41
|
});
|
|
39
42
|
/**
|
|
40
|
-
*
|
|
43
|
+
* Record touch start on a header. Drag activates after movement threshold.
|
|
41
44
|
*/
|
|
42
|
-
iris_layout.components.touch_drag.
|
|
45
|
+
iris_layout.components.touch_drag.start_touch_BANG_ = (function iris_layout$components$touch_drag$start_touch_BANG_(tile_id,entity_id,touch_event){
|
|
43
46
|
var touch = (touch_event.changedTouches[(0)]);
|
|
44
47
|
var x = touch.clientX;
|
|
45
48
|
var y = touch.clientY;
|
|
46
|
-
|
|
47
|
-
var ghost = iris_layout.components.touch_drag.create_ghost_BANG_(x,y);
|
|
48
|
-
cljs.core.reset_BANG_(iris_layout.components.touch_drag.touch_state,new cljs.core.PersistentArrayMap(null, 4, [new cljs.core.Keyword(null,"tile-id","tile-id",781804456),tile_id,new cljs.core.Keyword(null,"entity-id","entity-id",1485898093),entity_id,new cljs.core.Keyword(null,"ghost-el","ghost-el",-316931125),ghost,new cljs.core.Keyword(null,"active?","active?",459499776),true], null));
|
|
49
|
-
|
|
50
|
-
cljs.core.reset_BANG_(iris_layout.components.touch_drag.pending,null);
|
|
51
|
-
|
|
52
|
-
var temp__5804__auto___12630 = window.getSelection();
|
|
53
|
-
if(cljs.core.truth_(temp__5804__auto___12630)){
|
|
54
|
-
var sel_12631 = temp__5804__auto___12630;
|
|
55
|
-
sel_12631.removeAllRanges();
|
|
56
|
-
} else {
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
if(cljs.core.truth_(navigator.vibrate)){
|
|
60
|
-
navigator.vibrate((30));
|
|
61
|
-
} else {
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
if(cljs.core.truth_(on_activate)){
|
|
65
|
-
return (on_activate.cljs$core$IFn$_invoke$arity$0 ? on_activate.cljs$core$IFn$_invoke$arity$0() : on_activate.call(null));
|
|
66
|
-
} else {
|
|
67
|
-
return null;
|
|
68
|
-
}
|
|
69
|
-
}),iris_layout.components.touch_drag.long_press_ms);
|
|
70
|
-
return cljs.core.reset_BANG_(iris_layout.components.touch_drag.pending,new cljs.core.PersistentArrayMap(null, 5, [new cljs.core.Keyword(null,"timer-id","timer-id",1622357927),timer,new cljs.core.Keyword(null,"start-x","start-x",-193941684),x,new cljs.core.Keyword(null,"start-y","start-y",-771244577),y,new cljs.core.Keyword(null,"tile-id","tile-id",781804456),tile_id,new cljs.core.Keyword(null,"entity-id","entity-id",1485898093),entity_id], null));
|
|
49
|
+
return cljs.core.reset_BANG_(iris_layout.components.touch_drag.touch_start,new cljs.core.PersistentArrayMap(null, 4, [new cljs.core.Keyword(null,"start-x","start-x",-193941684),x,new cljs.core.Keyword(null,"start-y","start-y",-771244577),y,new cljs.core.Keyword(null,"tile-id","tile-id",781804456),tile_id,new cljs.core.Keyword(null,"entity-id","entity-id",1485898093),entity_id], null));
|
|
71
50
|
});
|
|
72
51
|
/**
|
|
73
|
-
* Cancel a
|
|
52
|
+
* Cancel a touch start without activating drag.
|
|
74
53
|
*/
|
|
75
|
-
iris_layout.components.touch_drag.
|
|
76
|
-
|
|
77
|
-
if(cljs.core.truth_(temp__5804__auto__)){
|
|
78
|
-
var p = temp__5804__auto__;
|
|
79
|
-
clearTimeout(new cljs.core.Keyword(null,"timer-id","timer-id",1622357927).cljs$core$IFn$_invoke$arity$1(p));
|
|
80
|
-
|
|
81
|
-
return cljs.core.reset_BANG_(iris_layout.components.touch_drag.pending,null);
|
|
82
|
-
} else {
|
|
83
|
-
return null;
|
|
84
|
-
}
|
|
54
|
+
iris_layout.components.touch_drag.cancel_touch_BANG_ = (function iris_layout$components$touch_drag$cancel_touch_BANG_(){
|
|
55
|
+
return cljs.core.reset_BANG_(iris_layout.components.touch_drag.touch_start,null);
|
|
85
56
|
});
|
|
86
57
|
/**
|
|
87
|
-
*
|
|
58
|
+
* Activate drag — create ghost and set drag state.
|
|
88
59
|
*/
|
|
89
|
-
iris_layout.components.touch_drag.
|
|
90
|
-
var
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
var
|
|
96
|
-
if(
|
|
97
|
-
|
|
60
|
+
iris_layout.components.touch_drag.activate_drag_BANG_ = (function iris_layout$components$touch_drag$activate_drag_BANG_(ts,x,y){
|
|
61
|
+
var ghost = iris_layout.components.touch_drag.create_ghost_BANG_(x,y);
|
|
62
|
+
cljs.core.reset_BANG_(iris_layout.components.touch_drag.touch_state,new cljs.core.PersistentArrayMap(null, 4, [new cljs.core.Keyword(null,"tile-id","tile-id",781804456),new cljs.core.Keyword(null,"tile-id","tile-id",781804456).cljs$core$IFn$_invoke$arity$1(ts),new cljs.core.Keyword(null,"entity-id","entity-id",1485898093),new cljs.core.Keyword(null,"entity-id","entity-id",1485898093).cljs$core$IFn$_invoke$arity$1(ts),new cljs.core.Keyword(null,"ghost-el","ghost-el",-316931125),ghost,new cljs.core.Keyword(null,"active?","active?",459499776),true], null));
|
|
63
|
+
|
|
64
|
+
cljs.core.reset_BANG_(iris_layout.components.touch_drag.touch_start,null);
|
|
65
|
+
|
|
66
|
+
var temp__5804__auto___6903 = window.getSelection();
|
|
67
|
+
if(cljs.core.truth_(temp__5804__auto___6903)){
|
|
68
|
+
var sel_6904 = temp__5804__auto___6903;
|
|
69
|
+
sel_6904.removeAllRanges();
|
|
98
70
|
} else {
|
|
99
|
-
return null;
|
|
100
71
|
}
|
|
72
|
+
|
|
73
|
+
if(cljs.core.truth_(navigator.vibrate)){
|
|
74
|
+
return navigator.vibrate((30));
|
|
101
75
|
} else {
|
|
102
76
|
return null;
|
|
103
77
|
}
|
|
@@ -190,15 +164,26 @@ return null;
|
|
|
190
164
|
}
|
|
191
165
|
});
|
|
192
166
|
/**
|
|
193
|
-
* End touch drag —
|
|
167
|
+
* End touch drag — publish drop result for target tile or workspace to handle, then clean up.
|
|
194
168
|
*/
|
|
195
169
|
iris_layout.components.touch_drag.end_drag_BANG_ = (function iris_layout$components$touch_drag$end_drag_BANG_(){
|
|
196
170
|
var state = cljs.core.deref(iris_layout.components.touch_drag.touch_state);
|
|
197
171
|
var target = cljs.core.deref(iris_layout.components.touch_drag.hover_target);
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
172
|
+
if(cljs.core.truth_(state)){
|
|
173
|
+
cljs.core.reset_BANG_(iris_layout.components.touch_drag.drop_result,(function (){var G__6894 = new cljs.core.PersistentArrayMap(null, 2, [new cljs.core.Keyword(null,"source-tile-id","source-tile-id",1477902631),new cljs.core.Keyword(null,"tile-id","tile-id",781804456).cljs$core$IFn$_invoke$arity$1(state),new cljs.core.Keyword(null,"source-entity-id","source-entity-id",-509281427),new cljs.core.Keyword(null,"entity-id","entity-id",1485898093).cljs$core$IFn$_invoke$arity$1(state)], null);
|
|
174
|
+
if(cljs.core.truth_(target)){
|
|
175
|
+
return cljs.core.assoc.cljs$core$IFn$_invoke$arity$variadic(G__6894,new cljs.core.Keyword(null,"target-tile-id","target-tile-id",-1830903484),new cljs.core.Keyword(null,"tile-id","tile-id",781804456).cljs$core$IFn$_invoke$arity$1(target),cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$2([new cljs.core.Keyword(null,"half","half",741990005),new cljs.core.Keyword(null,"half","half",741990005).cljs$core$IFn$_invoke$arity$1(target)], 0));
|
|
176
|
+
} else {
|
|
177
|
+
return G__6894;
|
|
178
|
+
}
|
|
179
|
+
})());
|
|
180
|
+
} else {
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
var temp__5804__auto___6905 = new cljs.core.Keyword(null,"ghost-el","ghost-el",-316931125).cljs$core$IFn$_invoke$arity$1(state);
|
|
184
|
+
if(cljs.core.truth_(temp__5804__auto___6905)){
|
|
185
|
+
var ghost_6906 = temp__5804__auto___6905;
|
|
186
|
+
ghost_6906.remove();
|
|
202
187
|
} else {
|
|
203
188
|
}
|
|
204
189
|
|
|
@@ -206,19 +191,7 @@ cljs.core.reset_BANG_(iris_layout.components.touch_drag.touch_state,null);
|
|
|
206
191
|
|
|
207
192
|
cljs.core.reset_BANG_(iris_layout.components.touch_drag.hover_target,null);
|
|
208
193
|
|
|
209
|
-
cljs.core.reset_BANG_(iris_layout.components.touch_drag.nav_edge_target,null);
|
|
210
|
-
|
|
211
|
-
if(cljs.core.truth_((function (){var and__5000__auto__ = state;
|
|
212
|
-
if(cljs.core.truth_(and__5000__auto__)){
|
|
213
|
-
return target;
|
|
214
|
-
} else {
|
|
215
|
-
return and__5000__auto__;
|
|
216
|
-
}
|
|
217
|
-
})())){
|
|
218
|
-
return new cljs.core.PersistentArrayMap(null, 4, [new cljs.core.Keyword(null,"source-tile-id","source-tile-id",1477902631),new cljs.core.Keyword(null,"tile-id","tile-id",781804456).cljs$core$IFn$_invoke$arity$1(state),new cljs.core.Keyword(null,"source-entity-id","source-entity-id",-509281427),new cljs.core.Keyword(null,"entity-id","entity-id",1485898093).cljs$core$IFn$_invoke$arity$1(state),new cljs.core.Keyword(null,"target-tile-id","target-tile-id",-1830903484),new cljs.core.Keyword(null,"tile-id","tile-id",781804456).cljs$core$IFn$_invoke$arity$1(target),new cljs.core.Keyword(null,"half","half",741990005),new cljs.core.Keyword(null,"half","half",741990005).cljs$core$IFn$_invoke$arity$1(target)], null);
|
|
219
|
-
} else {
|
|
220
|
-
return null;
|
|
221
|
-
}
|
|
194
|
+
return cljs.core.reset_BANG_(iris_layout.components.touch_drag.nav_edge_target,null);
|
|
222
195
|
});
|
|
223
196
|
if((typeof iris_layout !== 'undefined') && (typeof iris_layout.components !== 'undefined') && (typeof iris_layout.components.touch_drag !== 'undefined') && (typeof iris_layout.components.touch_drag._touch_listeners !== 'undefined')){
|
|
224
197
|
} else {
|
|
@@ -229,8 +202,21 @@ e.preventDefault();
|
|
|
229
202
|
|
|
230
203
|
return iris_layout.components.touch_drag.move_drag_BANG_(e);
|
|
231
204
|
} else {
|
|
232
|
-
if(iris_layout.components.touch_drag.
|
|
233
|
-
|
|
205
|
+
if(iris_layout.components.touch_drag.touch_started_QMARK_()){
|
|
206
|
+
var ts = cljs.core.deref(iris_layout.components.touch_drag.touch_start);
|
|
207
|
+
var touch = (e.changedTouches[(0)]);
|
|
208
|
+
var x = touch.clientX;
|
|
209
|
+
var y = touch.clientY;
|
|
210
|
+
var dx = (x - new cljs.core.Keyword(null,"start-x","start-x",-193941684).cljs$core$IFn$_invoke$arity$1(ts));
|
|
211
|
+
var dy = (y - new cljs.core.Keyword(null,"start-y","start-y",-771244577).cljs$core$IFn$_invoke$arity$1(ts));
|
|
212
|
+
var dist = Math.sqrt(((dx * dx) + (dy * dy)));
|
|
213
|
+
if((dist > iris_layout.components.touch_drag.move_threshold)){
|
|
214
|
+
e.preventDefault();
|
|
215
|
+
|
|
216
|
+
return iris_layout.components.touch_drag.activate_drag_BANG_(ts,x,y);
|
|
217
|
+
} else {
|
|
218
|
+
return null;
|
|
219
|
+
}
|
|
234
220
|
} else {
|
|
235
221
|
return null;
|
|
236
222
|
}
|
|
@@ -238,7 +224,7 @@ return null;
|
|
|
238
224
|
}),({"passive": false}));
|
|
239
225
|
|
|
240
226
|
document.addEventListener("touchend",(function (_e){
|
|
241
|
-
iris_layout.components.touch_drag.
|
|
227
|
+
iris_layout.components.touch_drag.cancel_touch_BANG_();
|
|
242
228
|
|
|
243
229
|
if(iris_layout.components.touch_drag.dragging_QMARK_()){
|
|
244
230
|
setTimeout((function (){
|
|
@@ -252,59 +238,59 @@ return null;
|
|
|
252
238
|
}
|
|
253
239
|
|
|
254
240
|
return setTimeout((function (){
|
|
255
|
-
var
|
|
256
|
-
var
|
|
257
|
-
var
|
|
258
|
-
var
|
|
241
|
+
var seq__6895 = cljs.core.seq(cljs.core.array_seq.cljs$core$IFn$_invoke$arity$1(document.querySelectorAll(".iris-touch-drag-ghost")));
|
|
242
|
+
var chunk__6896 = null;
|
|
243
|
+
var count__6897 = (0);
|
|
244
|
+
var i__6898 = (0);
|
|
259
245
|
while(true){
|
|
260
|
-
if((
|
|
261
|
-
var ghost =
|
|
246
|
+
if((i__6898 < count__6897)){
|
|
247
|
+
var ghost = chunk__6896.cljs$core$IIndexed$_nth$arity$2(null,i__6898);
|
|
262
248
|
if(iris_layout.components.touch_drag.dragging_QMARK_()){
|
|
263
249
|
} else {
|
|
264
250
|
ghost.remove();
|
|
265
251
|
}
|
|
266
252
|
|
|
267
253
|
|
|
268
|
-
var
|
|
269
|
-
var
|
|
270
|
-
var
|
|
271
|
-
var
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
254
|
+
var G__6908 = seq__6895;
|
|
255
|
+
var G__6909 = chunk__6896;
|
|
256
|
+
var G__6910 = count__6897;
|
|
257
|
+
var G__6911 = (i__6898 + (1));
|
|
258
|
+
seq__6895 = G__6908;
|
|
259
|
+
chunk__6896 = G__6909;
|
|
260
|
+
count__6897 = G__6910;
|
|
261
|
+
i__6898 = G__6911;
|
|
276
262
|
continue;
|
|
277
263
|
} else {
|
|
278
|
-
var temp__5804__auto__ = cljs.core.seq(
|
|
264
|
+
var temp__5804__auto__ = cljs.core.seq(seq__6895);
|
|
279
265
|
if(temp__5804__auto__){
|
|
280
|
-
var
|
|
281
|
-
if(cljs.core.chunked_seq_QMARK_(
|
|
282
|
-
var c__5525__auto__ = cljs.core.chunk_first(
|
|
283
|
-
var
|
|
284
|
-
var
|
|
285
|
-
var
|
|
286
|
-
var
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
266
|
+
var seq__6895__$1 = temp__5804__auto__;
|
|
267
|
+
if(cljs.core.chunked_seq_QMARK_(seq__6895__$1)){
|
|
268
|
+
var c__5525__auto__ = cljs.core.chunk_first(seq__6895__$1);
|
|
269
|
+
var G__6917 = cljs.core.chunk_rest(seq__6895__$1);
|
|
270
|
+
var G__6918 = c__5525__auto__;
|
|
271
|
+
var G__6919 = cljs.core.count(c__5525__auto__);
|
|
272
|
+
var G__6920 = (0);
|
|
273
|
+
seq__6895 = G__6917;
|
|
274
|
+
chunk__6896 = G__6918;
|
|
275
|
+
count__6897 = G__6919;
|
|
276
|
+
i__6898 = G__6920;
|
|
291
277
|
continue;
|
|
292
278
|
} else {
|
|
293
|
-
var ghost = cljs.core.first(
|
|
279
|
+
var ghost = cljs.core.first(seq__6895__$1);
|
|
294
280
|
if(iris_layout.components.touch_drag.dragging_QMARK_()){
|
|
295
281
|
} else {
|
|
296
282
|
ghost.remove();
|
|
297
283
|
}
|
|
298
284
|
|
|
299
285
|
|
|
300
|
-
var
|
|
301
|
-
var
|
|
302
|
-
var
|
|
303
|
-
var
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
286
|
+
var G__6921 = cljs.core.next(seq__6895__$1);
|
|
287
|
+
var G__6922 = null;
|
|
288
|
+
var G__6923 = (0);
|
|
289
|
+
var G__6924 = (0);
|
|
290
|
+
seq__6895 = G__6921;
|
|
291
|
+
chunk__6896 = G__6922;
|
|
292
|
+
count__6897 = G__6923;
|
|
293
|
+
i__6898 = G__6924;
|
|
308
294
|
continue;
|
|
309
295
|
}
|
|
310
296
|
} else {
|
|
@@ -317,7 +303,7 @@ break;
|
|
|
317
303
|
}),({"passive": true}));
|
|
318
304
|
|
|
319
305
|
document.addEventListener("contextmenu",(function (e){
|
|
320
|
-
if(((iris_layout.components.touch_drag.
|
|
306
|
+
if(((iris_layout.components.touch_drag.touch_started_QMARK_()) || (iris_layout.components.touch_drag.dragging_QMARK_()))){
|
|
321
307
|
return e.preventDefault();
|
|
322
308
|
} else {
|
|
323
309
|
return null;
|
|
@@ -325,7 +311,7 @@ return null;
|
|
|
325
311
|
}),({"passive": false}));
|
|
326
312
|
|
|
327
313
|
document.addEventListener("touchcancel",(function (_e){
|
|
328
|
-
iris_layout.components.touch_drag.
|
|
314
|
+
iris_layout.components.touch_drag.cancel_touch_BANG_();
|
|
329
315
|
|
|
330
316
|
if(iris_layout.components.touch_drag.dragging_QMARK_()){
|
|
331
317
|
iris_layout.components.touch_drag.end_drag_BANG_();
|
|
@@ -333,53 +319,53 @@ iris_layout.components.touch_drag.end_drag_BANG_();
|
|
|
333
319
|
}
|
|
334
320
|
|
|
335
321
|
return setTimeout((function (){
|
|
336
|
-
var
|
|
337
|
-
var
|
|
338
|
-
var
|
|
339
|
-
var
|
|
322
|
+
var seq__6899 = cljs.core.seq(cljs.core.array_seq.cljs$core$IFn$_invoke$arity$1(document.querySelectorAll(".iris-touch-drag-ghost")));
|
|
323
|
+
var chunk__6900 = null;
|
|
324
|
+
var count__6901 = (0);
|
|
325
|
+
var i__6902 = (0);
|
|
340
326
|
while(true){
|
|
341
|
-
if((
|
|
342
|
-
var ghost =
|
|
327
|
+
if((i__6902 < count__6901)){
|
|
328
|
+
var ghost = chunk__6900.cljs$core$IIndexed$_nth$arity$2(null,i__6902);
|
|
343
329
|
ghost.remove();
|
|
344
330
|
|
|
345
331
|
|
|
346
|
-
var
|
|
347
|
-
var
|
|
348
|
-
var
|
|
349
|
-
var
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
332
|
+
var G__6931 = seq__6899;
|
|
333
|
+
var G__6932 = chunk__6900;
|
|
334
|
+
var G__6933 = count__6901;
|
|
335
|
+
var G__6934 = (i__6902 + (1));
|
|
336
|
+
seq__6899 = G__6931;
|
|
337
|
+
chunk__6900 = G__6932;
|
|
338
|
+
count__6901 = G__6933;
|
|
339
|
+
i__6902 = G__6934;
|
|
354
340
|
continue;
|
|
355
341
|
} else {
|
|
356
|
-
var temp__5804__auto__ = cljs.core.seq(
|
|
342
|
+
var temp__5804__auto__ = cljs.core.seq(seq__6899);
|
|
357
343
|
if(temp__5804__auto__){
|
|
358
|
-
var
|
|
359
|
-
if(cljs.core.chunked_seq_QMARK_(
|
|
360
|
-
var c__5525__auto__ = cljs.core.chunk_first(
|
|
361
|
-
var
|
|
362
|
-
var
|
|
363
|
-
var
|
|
364
|
-
var
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
344
|
+
var seq__6899__$1 = temp__5804__auto__;
|
|
345
|
+
if(cljs.core.chunked_seq_QMARK_(seq__6899__$1)){
|
|
346
|
+
var c__5525__auto__ = cljs.core.chunk_first(seq__6899__$1);
|
|
347
|
+
var G__6935 = cljs.core.chunk_rest(seq__6899__$1);
|
|
348
|
+
var G__6936 = c__5525__auto__;
|
|
349
|
+
var G__6937 = cljs.core.count(c__5525__auto__);
|
|
350
|
+
var G__6938 = (0);
|
|
351
|
+
seq__6899 = G__6935;
|
|
352
|
+
chunk__6900 = G__6936;
|
|
353
|
+
count__6901 = G__6937;
|
|
354
|
+
i__6902 = G__6938;
|
|
369
355
|
continue;
|
|
370
356
|
} else {
|
|
371
|
-
var ghost = cljs.core.first(
|
|
357
|
+
var ghost = cljs.core.first(seq__6899__$1);
|
|
372
358
|
ghost.remove();
|
|
373
359
|
|
|
374
360
|
|
|
375
|
-
var
|
|
376
|
-
var
|
|
377
|
-
var
|
|
378
|
-
var
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
361
|
+
var G__6945 = cljs.core.next(seq__6899__$1);
|
|
362
|
+
var G__6946 = null;
|
|
363
|
+
var G__6947 = (0);
|
|
364
|
+
var G__6948 = (0);
|
|
365
|
+
seq__6899 = G__6945;
|
|
366
|
+
chunk__6900 = G__6946;
|
|
367
|
+
count__6901 = G__6947;
|
|
368
|
+
i__6902 = G__6948;
|
|
383
369
|
continue;
|
|
384
370
|
}
|
|
385
371
|
} else {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["iris_layout/components/touch_drag.cljs"],"mappings":"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","names":["iris-layout.components.touch-drag/long-press-ms","iris-layout.components.touch-drag/move-tolerance","js/iris-layout","js/iris-layout.components","js/iris-layout.components.touch-drag","js/iris-layout.components.touch-drag.touch-state","iris-layout.components.touch-drag/touch-state","reagent.core.atom","js/iris-layout.components.touch-drag.hover-target","iris-layout.components.touch-drag/hover-target","js/iris-layout.components.touch-drag.nav-edge-target","iris-layout.components.touch-drag/nav-edge-target","js/iris-layout.components.touch-drag.pending","iris-layout.components.touch-drag/pending","cljs.core.atom","iris-layout.components.touch-drag/dragging?","cljs.core/deref","iris-layout.components.touch-drag/pending?","iris-layout.components.touch-drag/create-ghost!","x","y","ghost","js/document.createElement","js/document.body","iris-layout.components.touch-drag/start-pending!","tile-id","entity-id","touch-event","on-activate","touch","timer","js/setTimeout","cljs.core/reset!","temp__5804__auto__","sel","js/window.getSelection","js/navigator","iris-layout.components.touch-drag/cancel-pending!","p","js/clearTimeout","iris-layout.components.touch-drag/check-move-cancel!","dx","dy","js/Math.sqrt","iris-layout.components.touch-drag/find-tile-element","el","js/document.elementFromPoint","iris-layout.components.touch-drag/calculate-half-xy","rect","cx","cy","js/Math.abs","iris-layout.components.touch-drag/move-drag!","state","el-under","nav-el","tile-el","dir","half","iris-layout.components.touch-drag/end-drag!","target","and__5000__auto__","js/iris-layout.components.touch-drag._touch-listeners","iris-layout.components.touch-drag/_touch-listeners","js/document","e","_e","seq__12622","cljs.core/seq","chunk__12623","count__12624","i__12625","cljs.core/chunked-seq?","c__5525__auto__","cljs.core/chunk-first","cljs.core/chunk-rest","cljs.core/count","cljs.core/first","cljs.core/next","cljs.core.array_seq","seq__12626","chunk__12627","count__12628","i__12629"],"sourcesContent":["(ns iris-layout.components.touch-drag\n \"Touch drag state \u2014 shared across all tiles for mobile drag-drop.\n\n On touch devices, HTML5 Drag and Drop doesn't work. This module\n provides a global touch-drag state that tiles subscribe to.\n\n Flow:\n 1. Header long-press (~400ms) \u2192 sets drag source info, creates ghost\n 2. Global touchmove \u2192 updates ghost position, finds tile under finger\n 3. Touchend \u2192 performs drop on target tile, cleans up\"\n (:require [reagent.core :as r]))\n\n;; Long-press duration in ms\n(def long-press-ms 400)\n\n;; Tolerance in px \u2014 if finger moves more than this, cancel long-press\n(def move-tolerance 10)\n\n;; Global touch drag state\n(defonce touch-state (r/atom nil))\n;; Shape: {:tile-id str :entity-id str :ghost-el DOM :active? bool}\n\n(defonce hover-target (r/atom nil))\n;; Shape: {:tile-el DOM :tile-id str :half keyword} or nil\n\n;; Nav edge target \u2014 tracks when touch hovers over a nav edge during drag\n(defonce nav-edge-target (r/atom nil))\n;; Shape: :left | :right | :up | :down | nil\n\n;; Long-press pending state (not reactive, internal only)\n(defonce ^:private pending (atom nil))\n;; Shape: {:timer-id int :start-x num :start-y num :tile-id str :entity-id str}\n\n(defn dragging? []\n (some? @touch-state))\n\n(defn pending? []\n (some? @pending))\n\n(defn- create-ghost! [x y]\n (let [ghost (js/document.createElement \"div\")]\n (set! (.-className ghost) \"iris-touch-drag-ghost\")\n (set! (.-cssText (.-style ghost))\n (str \"position:fixed;z-index:10000;pointer-events:none;\"\n \"background:rgba(99,102,241,0.8);color:#fff;padding:6px 14px;\"\n \"border-radius:8px;font-size:12px;font-weight:500;\"\n \"box-shadow:0 4px 20px rgba(0,0,0,0.4);\"\n \"left:\" (- x 40) \"px;\"\n \"top:\" (- y 20) \"px;\"))\n (.appendChild js/document.body ghost)\n ghost))\n\n(defn start-pending!\n \"Begin long-press detection on a header touchstart.\"\n [tile-id entity-id touch-event on-activate]\n (let [touch (aget (.-changedTouches touch-event) 0)\n x (.-clientX touch)\n y (.-clientY touch)\n timer (js/setTimeout\n (fn []\n ;; Long-press triggered \u2014 activate drag\n (let [ghost (create-ghost! x y)]\n (reset! touch-state {:tile-id tile-id\n :entity-id entity-id\n :ghost-el ghost\n :active? true})\n (reset! pending nil)\n ;; Clear any text selection\n (when-let [sel (js/window.getSelection)]\n (.removeAllRanges sel))\n ;; Vibrate for haptic feedback if available\n (when (.-vibrate js/navigator)\n (.vibrate js/navigator 30))\n (when on-activate (on-activate))))\n long-press-ms)]\n (reset! pending {:timer-id timer\n :start-x x\n :start-y y\n :tile-id tile-id\n :entity-id entity-id})))\n\n(defn cancel-pending!\n \"Cancel a pending long-press.\"\n []\n (when-let [p @pending]\n (js/clearTimeout (:timer-id p))\n (reset! pending nil)))\n\n(defn check-move-cancel!\n \"Cancel long-press if finger moved too far.\"\n [touch-event]\n (when-let [p @pending]\n (let [touch (aget (.-changedTouches touch-event) 0)\n dx (- (.-clientX touch) (:start-x p))\n dy (- (.-clientY touch) (:start-y p))]\n (when (> (js/Math.sqrt (+ (* dx dx) (* dy dy))) move-tolerance)\n (cancel-pending!)))))\n\n(defn- find-tile-element\n \"Find the closest .iris-entity-tile ancestor from the element at point.\"\n [x y]\n (when-let [el (js/document.elementFromPoint x y)]\n (.closest el \".iris-entity-tile\")))\n\n(defn- calculate-half-xy\n \"Determine which half of an element a point is closest to.\"\n [x y el]\n (let [rect (.getBoundingClientRect el)\n cx (+ (.-left rect) (/ (.-width rect) 2))\n cy (+ (.-top rect) (/ (.-height rect) 2))\n dx (- x cx)\n dy (- y cy)]\n (if (> (js/Math.abs dx) (js/Math.abs dy))\n (if (neg? dx) :left :right)\n (if (neg? dy) :top :bottom))))\n\n(defn move-drag!\n \"Update ghost position and find tile under finger.\"\n [touch-event]\n (when-let [state @touch-state]\n (let [touch (aget (.-changedTouches touch-event) 0)\n x (.-clientX touch)\n y (.-clientY touch)\n ghost (:ghost-el state)]\n ;; Move ghost\n (when ghost\n (set! (.-left (.-style ghost)) (str (- x 40) \"px\"))\n (set! (.-top (.-style ghost)) (str (- y 20) \"px\")))\n ;; Hide ghost briefly to find element underneath\n (when ghost (set! (.-display (.-style ghost)) \"none\"))\n (let [el-under (js/document.elementFromPoint x y)\n nav-el (when el-under (.closest el-under \".iris-nav-edge\"))\n tile-el (find-tile-element x y)]\n (when ghost (set! (.-display (.-style ghost)) \"\"))\n (if nav-el\n (let [dir (cond\n (.contains (.-classList nav-el) \"iris-nav-left\") :left\n (.contains (.-classList nav-el) \"iris-nav-right\") :right\n (.contains (.-classList nav-el) \"iris-nav-top\") :up\n (.contains (.-classList nav-el) \"iris-nav-bottom\") :down\n :else nil)]\n (reset! nav-edge-target dir)\n (reset! hover-target nil))\n (do\n (reset! nav-edge-target nil)\n (if tile-el\n (let [half (calculate-half-xy x y tile-el)\n tile-id (.getAttribute tile-el \"data-tile-id\")]\n (reset! hover-target {:tile-el tile-el :tile-id tile-id :half half}))\n (reset! hover-target nil))))))))\n\n(defn end-drag!\n \"End touch drag \u2014 return the drop target info and clean up.\"\n []\n (let [state @touch-state\n target @hover-target]\n ;; Clean up ghost\n (when-let [ghost (:ghost-el state)]\n (.remove ghost))\n (reset! touch-state nil)\n (reset! hover-target nil)\n (reset! nav-edge-target nil)\n ;; Return drop info\n (when (and state target)\n {:source-tile-id (:tile-id state)\n :source-entity-id (:entity-id state)\n :target-tile-id (:tile-id target)\n :half (:half target)})))\n\n;; Global touch listeners (attached once)\n(defonce _touch-listeners\n (do\n (.addEventListener js/document \"touchmove\"\n (fn [e]\n (cond\n ;; Active drag \u2014 move ghost and find target\n (dragging?)\n (do (.preventDefault e)\n (move-drag! e))\n ;; Pending long-press \u2014 check if moved too far\n (pending?)\n (check-move-cancel! e)))\n #js {:passive false})\n (.addEventListener js/document \"touchend\"\n (fn [_e]\n ;; Cancel pending long-press on lift\n (cancel-pending!)\n ;; Safety cleanup for active drag (individual tiles handle the drop)\n ;; Also remove any orphaned ghost elements\n (when (dragging?)\n (js/setTimeout #(when (dragging?) (end-drag!)) 100))\n ;; Belt-and-suspenders: remove any leftover ghost elements\n (js/setTimeout\n (fn []\n (doseq [ghost (array-seq (.querySelectorAll js/document \".iris-touch-drag-ghost\"))]\n (when-not (dragging?)\n (.remove ghost))))\n 300))\n #js {:passive true})\n ;; Prevent context menu during long-press / active drag\n (.addEventListener js/document \"contextmenu\"\n (fn [e]\n (when (or (pending?) (dragging?))\n (.preventDefault e)))\n #js {:passive false})\n (.addEventListener js/document \"touchcancel\"\n (fn [_e]\n (cancel-pending!)\n (when (dragging?) (end-drag!))\n ;; Remove any orphaned ghost elements\n (js/setTimeout\n (fn []\n (doseq [ghost (array-seq (.querySelectorAll js/document \".iris-touch-drag-ghost\"))]\n (.remove ghost)))\n 100))\n #js {:passive true})\n true))\n"]}
|
|
1
|
+
{"version":3,"sources":["iris_layout/components/touch_drag.cljs"],"mappings":"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","names":["iris-layout.components.touch-drag/move-threshold","js/iris-layout","js/iris-layout.components","js/iris-layout.components.touch-drag","js/iris-layout.components.touch-drag.touch-state","iris-layout.components.touch-drag/touch-state","reagent.core.atom","js/iris-layout.components.touch-drag.hover-target","iris-layout.components.touch-drag/hover-target","js/iris-layout.components.touch-drag.nav-edge-target","iris-layout.components.touch-drag/nav-edge-target","js/iris-layout.components.touch-drag.drop-result","iris-layout.components.touch-drag/drop-result","js/iris-layout.components.touch-drag.touch-start","iris-layout.components.touch-drag/touch-start","cljs.core.atom","iris-layout.components.touch-drag/dragging?","cljs.core/deref","iris-layout.components.touch-drag/touch-started?","iris-layout.components.touch-drag/create-ghost!","x","y","ghost","js/document.createElement","js/document.body","iris-layout.components.touch-drag/start-touch!","tile-id","entity-id","touch-event","touch","cljs.core/reset!","iris-layout.components.touch-drag/cancel-touch!","iris-layout.components.touch-drag/activate-drag!","ts","temp__5804__auto__","sel","js/window.getSelection","js/navigator","iris-layout.components.touch-drag/find-tile-element","el","js/document.elementFromPoint","iris-layout.components.touch-drag/calculate-half-xy","rect","cx","cy","dx","dy","js/Math.abs","iris-layout.components.touch-drag/move-drag!","state","el-under","nav-el","tile-el","dir","half","iris-layout.components.touch-drag/end-drag!","target","G__6894","cljs.core.assoc","js/iris-layout.components.touch-drag._touch-listeners","iris-layout.components.touch-drag/_touch-listeners","js/document","e","dist","js/Math.sqrt","_e","js/setTimeout","seq__6895","cljs.core/seq","chunk__6896","count__6897","i__6898","cljs.core/chunked-seq?","c__5525__auto__","cljs.core/chunk-first","cljs.core/chunk-rest","cljs.core/count","cljs.core/first","cljs.core/next","cljs.core.array_seq","seq__6899","chunk__6900","count__6901","i__6902"],"sourcesContent":["(ns iris-layout.components.touch-drag\n \"Touch drag state \u2014 shared across all tiles for mobile drag-drop.\n\n On touch devices, HTML5 Drag and Drop doesn't work. This module\n provides a global touch-drag state that tiles subscribe to.\n\n Flow:\n 1. Header touchstart \u2192 records start position and source info\n 2. Global touchmove \u2192 after small movement, activates drag with ghost\n 3. Touchend \u2192 performs drop on target tile, cleans up\"\n (:require [reagent.core :as r]))\n\n;; Movement threshold in px \u2014 drag activates after finger moves this far\n(def move-threshold 8)\n\n;; Global touch drag state\n(defonce touch-state (r/atom nil))\n;; Shape: {:tile-id str :entity-id str :ghost-el DOM :active? bool}\n\n(defonce hover-target (r/atom nil))\n;; Shape: {:tile-el DOM :tile-id str :half keyword} or nil\n\n;; Nav edge target \u2014 tracks when touch hovers over a nav edge during drag\n(defonce nav-edge-target (r/atom nil))\n;; Shape: :left | :right | :up | :down | nil\n\n;; Drop result \u2014 set when drag ends, watched by target tiles to execute the split\n(defonce drop-result (r/atom nil))\n;; Shape: {:source-tile-id str :source-entity-id str :target-tile-id str :half keyword} or nil\n\n;; Touch start state (not reactive, internal only)\n(defonce ^:private touch-start (atom nil))\n;; Shape: {:start-x num :start-y num :tile-id str :entity-id str}\n\n(defn dragging? []\n (some? @touch-state))\n\n(defn touch-started? []\n (some? @touch-start))\n\n(defn- create-ghost! [x y]\n (let [ghost (js/document.createElement \"div\")]\n (set! (.-className ghost) \"iris-touch-drag-ghost\")\n (set! (.-cssText (.-style ghost))\n (str \"position:fixed;z-index:10000;pointer-events:none;\"\n \"background:rgba(99,102,241,0.8);color:#fff;padding:6px 14px;\"\n \"border-radius:8px;font-size:12px;font-weight:500;\"\n \"box-shadow:0 4px 20px rgba(0,0,0,0.4);\"\n \"left:\" (- x 40) \"px;\"\n \"top:\" (- y 20) \"px;\"))\n (.appendChild js/document.body ghost)\n ghost))\n\n(defn start-touch!\n \"Record touch start on a header. Drag activates after movement threshold.\"\n [tile-id entity-id touch-event]\n (let [touch (aget (.-changedTouches touch-event) 0)\n x (.-clientX touch)\n y (.-clientY touch)]\n (reset! touch-start {:start-x x\n :start-y y\n :tile-id tile-id\n :entity-id entity-id})))\n\n(defn cancel-touch!\n \"Cancel a touch start without activating drag.\"\n []\n (reset! touch-start nil))\n\n(defn- activate-drag!\n \"Activate drag \u2014 create ghost and set drag state.\"\n [ts x y]\n (let [ghost (create-ghost! x y)]\n (reset! touch-state {:tile-id (:tile-id ts)\n :entity-id (:entity-id ts)\n :ghost-el ghost\n :active? true})\n (reset! touch-start nil)\n ;; Clear any text selection\n (when-let [sel (js/window.getSelection)]\n (.removeAllRanges sel))\n ;; Vibrate for haptic feedback if available\n (when (.-vibrate js/navigator)\n (.vibrate js/navigator 30))))\n\n(defn- find-tile-element\n \"Find the closest .iris-entity-tile ancestor from the element at point.\"\n [x y]\n (when-let [el (js/document.elementFromPoint x y)]\n (.closest el \".iris-entity-tile\")))\n\n(defn- calculate-half-xy\n \"Determine which half of an element a point is closest to.\"\n [x y el]\n (let [rect (.getBoundingClientRect el)\n cx (+ (.-left rect) (/ (.-width rect) 2))\n cy (+ (.-top rect) (/ (.-height rect) 2))\n dx (- x cx)\n dy (- y cy)]\n (if (> (js/Math.abs dx) (js/Math.abs dy))\n (if (neg? dx) :left :right)\n (if (neg? dy) :top :bottom))))\n\n(defn move-drag!\n \"Update ghost position and find tile under finger.\"\n [touch-event]\n (when-let [state @touch-state]\n (let [touch (aget (.-changedTouches touch-event) 0)\n x (.-clientX touch)\n y (.-clientY touch)\n ghost (:ghost-el state)]\n ;; Move ghost\n (when ghost\n (set! (.-left (.-style ghost)) (str (- x 40) \"px\"))\n (set! (.-top (.-style ghost)) (str (- y 20) \"px\")))\n ;; Hide ghost briefly to find element underneath\n (when ghost (set! (.-display (.-style ghost)) \"none\"))\n (let [el-under (js/document.elementFromPoint x y)\n nav-el (when el-under (.closest el-under \".iris-nav-edge\"))\n tile-el (find-tile-element x y)]\n (when ghost (set! (.-display (.-style ghost)) \"\"))\n (if nav-el\n (let [dir (cond\n (.contains (.-classList nav-el) \"iris-nav-left\") :left\n (.contains (.-classList nav-el) \"iris-nav-right\") :right\n (.contains (.-classList nav-el) \"iris-nav-top\") :up\n (.contains (.-classList nav-el) \"iris-nav-bottom\") :down\n :else nil)]\n (reset! nav-edge-target dir)\n (reset! hover-target nil))\n (do\n (reset! nav-edge-target nil)\n (if tile-el\n (let [half (calculate-half-xy x y tile-el)\n tile-id (.getAttribute tile-el \"data-tile-id\")]\n (reset! hover-target {:tile-el tile-el :tile-id tile-id :half half}))\n (reset! hover-target nil))))))))\n\n(defn end-drag!\n \"End touch drag \u2014 publish drop result for target tile or workspace to handle, then clean up.\"\n []\n (let [state @touch-state\n target @hover-target]\n ;; Publish drop result \u2014 with or without a target tile\n (when state\n (reset! drop-result (cond-> {:source-tile-id (:tile-id state)\n :source-entity-id (:entity-id state)}\n target (assoc :target-tile-id (:tile-id target)\n :half (:half target)))))\n ;; Clean up ghost\n (when-let [ghost (:ghost-el state)]\n (.remove ghost))\n (reset! touch-state nil)\n (reset! hover-target nil)\n (reset! nav-edge-target nil)))\n\n;; Global touch listeners (attached once)\n(defonce _touch-listeners\n (do\n (.addEventListener js/document \"touchmove\"\n (fn [e]\n (cond\n ;; Active drag \u2014 move ghost and find target\n (dragging?)\n (do (.preventDefault e)\n (move-drag! e))\n ;; Touch started on header \u2014 check if moved enough to activate drag\n (touch-started?)\n (let [ts @touch-start\n touch (aget (.-changedTouches e) 0)\n x (.-clientX touch)\n y (.-clientY touch)\n dx (- x (:start-x ts))\n dy (- y (:start-y ts))\n dist (js/Math.sqrt (+ (* dx dx) (* dy dy)))]\n (when (> dist move-threshold)\n (.preventDefault e)\n (activate-drag! ts x y)))))\n #js {:passive false})\n (.addEventListener js/document \"touchend\"\n (fn [_e]\n ;; Cancel touch start on lift (was a tap, not drag)\n (cancel-touch!)\n ;; Safety cleanup for active drag (individual tiles handle the drop)\n (when (dragging?)\n (js/setTimeout #(when (dragging?) (end-drag!)) 100))\n ;; Remove any leftover ghost elements\n (js/setTimeout\n (fn []\n (doseq [ghost (array-seq (.querySelectorAll js/document \".iris-touch-drag-ghost\"))]\n (when-not (dragging?)\n (.remove ghost))))\n 300))\n #js {:passive true})\n ;; Prevent context menu during drag\n (.addEventListener js/document \"contextmenu\"\n (fn [e]\n (when (or (touch-started?) (dragging?))\n (.preventDefault e)))\n #js {:passive false})\n (.addEventListener js/document \"touchcancel\"\n (fn [_e]\n (cancel-touch!)\n (when (dragging?) (end-drag!))\n ;; Remove any orphaned ghost elements\n (js/setTimeout\n (fn []\n (doseq [ghost (array-seq (.querySelectorAll js/document \".iris-touch-drag-ghost\"))]\n (.remove ghost)))\n 100))\n #js {:passive true})\n true))\n"]}
|