@p4ulcristian/iris-layout 0.2.5 → 0.2.7

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.
@@ -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.long_press_ms = (400);
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.pending !== 'undefined')){
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.pending = cljs.core.atom.cljs$core$IFn$_invoke$arity$1(null);
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.pending_QMARK_ = (function iris_layout$components$touch_drag$pending_QMARK_(){
27
- return (!((cljs.core.deref(iris_layout.components.touch_drag.pending) == null)));
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
- * Begin long-press detection on a header touchstart.
43
+ * Record touch start on a header. Drag activates after movement threshold.
41
44
  */
42
- iris_layout.components.touch_drag.start_pending_BANG_ = (function iris_layout$components$touch_drag$start_pending_BANG_(tile_id,entity_id,touch_event,on_activate){
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
- var timer = setTimeout((function (){
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 pending long-press.
52
+ * Cancel a touch start without activating drag.
74
53
  */
75
- iris_layout.components.touch_drag.cancel_pending_BANG_ = (function iris_layout$components$touch_drag$cancel_pending_BANG_(){
76
- var temp__5804__auto__ = cljs.core.deref(iris_layout.components.touch_drag.pending);
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
- * Cancel long-press if finger moved too far.
58
+ * Activate drag create ghost and set drag state.
88
59
  */
89
- iris_layout.components.touch_drag.check_move_cancel_BANG_ = (function iris_layout$components$touch_drag$check_move_cancel_BANG_(touch_event){
90
- var temp__5804__auto__ = cljs.core.deref(iris_layout.components.touch_drag.pending);
91
- if(cljs.core.truth_(temp__5804__auto__)){
92
- var p = temp__5804__auto__;
93
- var touch = (touch_event.changedTouches[(0)]);
94
- var dx = (touch.clientX - new cljs.core.Keyword(null,"start-x","start-x",-193941684).cljs$core$IFn$_invoke$arity$1(p));
95
- var dy = (touch.clientY - new cljs.core.Keyword(null,"start-y","start-y",-771244577).cljs$core$IFn$_invoke$arity$1(p));
96
- if((Math.sqrt(((dx * dx) + (dy * dy))) > iris_layout.components.touch_drag.move_tolerance)){
97
- return iris_layout.components.touch_drag.cancel_pending_BANG_();
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 — return the drop target info and clean up.
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
- var temp__5804__auto___12632 = new cljs.core.Keyword(null,"ghost-el","ghost-el",-316931125).cljs$core$IFn$_invoke$arity$1(state);
199
- if(cljs.core.truth_(temp__5804__auto___12632)){
200
- var ghost_12633 = temp__5804__auto___12632;
201
- ghost_12633.remove();
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.pending_QMARK_()){
233
- return iris_layout.components.touch_drag.check_move_cancel_BANG_(e);
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.cancel_pending_BANG_();
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 seq__12622 = cljs.core.seq(cljs.core.array_seq.cljs$core$IFn$_invoke$arity$1(document.querySelectorAll(".iris-touch-drag-ghost")));
256
- var chunk__12623 = null;
257
- var count__12624 = (0);
258
- var i__12625 = (0);
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((i__12625 < count__12624)){
261
- var ghost = chunk__12623.cljs$core$IIndexed$_nth$arity$2(null,i__12625);
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 G__12634 = seq__12622;
269
- var G__12635 = chunk__12623;
270
- var G__12636 = count__12624;
271
- var G__12637 = (i__12625 + (1));
272
- seq__12622 = G__12634;
273
- chunk__12623 = G__12635;
274
- count__12624 = G__12636;
275
- i__12625 = G__12637;
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(seq__12622);
264
+ var temp__5804__auto__ = cljs.core.seq(seq__6895);
279
265
  if(temp__5804__auto__){
280
- var seq__12622__$1 = temp__5804__auto__;
281
- if(cljs.core.chunked_seq_QMARK_(seq__12622__$1)){
282
- var c__5525__auto__ = cljs.core.chunk_first(seq__12622__$1);
283
- var G__12639 = cljs.core.chunk_rest(seq__12622__$1);
284
- var G__12640 = c__5525__auto__;
285
- var G__12641 = cljs.core.count(c__5525__auto__);
286
- var G__12642 = (0);
287
- seq__12622 = G__12639;
288
- chunk__12623 = G__12640;
289
- count__12624 = G__12641;
290
- i__12625 = G__12642;
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(seq__12622__$1);
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 G__12643 = cljs.core.next(seq__12622__$1);
301
- var G__12644 = null;
302
- var G__12645 = (0);
303
- var G__12646 = (0);
304
- seq__12622 = G__12643;
305
- chunk__12623 = G__12644;
306
- count__12624 = G__12645;
307
- i__12625 = G__12646;
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.pending_QMARK_()) || (iris_layout.components.touch_drag.dragging_QMARK_()))){
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.cancel_pending_BANG_();
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 seq__12626 = cljs.core.seq(cljs.core.array_seq.cljs$core$IFn$_invoke$arity$1(document.querySelectorAll(".iris-touch-drag-ghost")));
337
- var chunk__12627 = null;
338
- var count__12628 = (0);
339
- var i__12629 = (0);
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((i__12629 < count__12628)){
342
- var ghost = chunk__12627.cljs$core$IIndexed$_nth$arity$2(null,i__12629);
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 G__12647 = seq__12626;
347
- var G__12648 = chunk__12627;
348
- var G__12649 = count__12628;
349
- var G__12650 = (i__12629 + (1));
350
- seq__12626 = G__12647;
351
- chunk__12627 = G__12648;
352
- count__12628 = G__12649;
353
- i__12629 = G__12650;
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(seq__12626);
342
+ var temp__5804__auto__ = cljs.core.seq(seq__6899);
357
343
  if(temp__5804__auto__){
358
- var seq__12626__$1 = temp__5804__auto__;
359
- if(cljs.core.chunked_seq_QMARK_(seq__12626__$1)){
360
- var c__5525__auto__ = cljs.core.chunk_first(seq__12626__$1);
361
- var G__12651 = cljs.core.chunk_rest(seq__12626__$1);
362
- var G__12652 = c__5525__auto__;
363
- var G__12653 = cljs.core.count(c__5525__auto__);
364
- var G__12654 = (0);
365
- seq__12626 = G__12651;
366
- chunk__12627 = G__12652;
367
- count__12628 = G__12653;
368
- i__12629 = G__12654;
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(seq__12626__$1);
357
+ var ghost = cljs.core.first(seq__6899__$1);
372
358
  ghost.remove();
373
359
 
374
360
 
375
- var G__12655 = cljs.core.next(seq__12626__$1);
376
- var G__12656 = null;
377
- var G__12657 = (0);
378
- var G__12658 = (0);
379
- seq__12626 = G__12655;
380
- chunk__12627 = G__12656;
381
- count__12628 = G__12657;
382
- i__12629 = G__12658;
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"]}