uikit-on-rails 1.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (120) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +18 -0
  3. data/README.md +37 -0
  4. data/Rakefile +1 -0
  5. data/lib/uikit-on-rails.rb +1 -0
  6. data/lib/uikit/sass/rails.rb +2 -0
  7. data/lib/uikit/sass/rails/engine.rb +12 -0
  8. data/lib/uikit/sass/rails/version.rb +7 -0
  9. data/uikit-on-rails.gemspec +23 -0
  10. data/vendor/assets/fonts/fontawesome-webfont.eot +0 -0
  11. data/vendor/assets/fonts/fontawesome-webfont.otf +0 -0
  12. data/vendor/assets/fonts/fontawesome-webfont.svg +565 -0
  13. data/vendor/assets/fonts/fontawesome-webfont.ttf +0 -0
  14. data/vendor/assets/fonts/fontawesome-webfont.woff +0 -0
  15. data/vendor/assets/fonts/fontawesome-webfont.woff2 +0 -0
  16. data/vendor/assets/javascripts/uikit.js +19 -0
  17. data/vendor/assets/javascripts/uikit/components/accordion.js +180 -0
  18. data/vendor/assets/javascripts/uikit/components/autocomplete.js +340 -0
  19. data/vendor/assets/javascripts/uikit/components/datepicker.js +3167 -0
  20. data/vendor/assets/javascripts/uikit/components/form-password.js +67 -0
  21. data/vendor/assets/javascripts/uikit/components/form-select.js +85 -0
  22. data/vendor/assets/javascripts/uikit/components/grid-parallax.js +168 -0
  23. data/vendor/assets/javascripts/uikit/components/grid.js +540 -0
  24. data/vendor/assets/javascripts/uikit/components/htmleditor.js +679 -0
  25. data/vendor/assets/javascripts/uikit/components/lightbox.js +591 -0
  26. data/vendor/assets/javascripts/uikit/components/nestable.js +653 -0
  27. data/vendor/assets/javascripts/uikit/components/notify.js +189 -0
  28. data/vendor/assets/javascripts/uikit/components/pagination.js +147 -0
  29. data/vendor/assets/javascripts/uikit/components/parallax.js +462 -0
  30. data/vendor/assets/javascripts/uikit/components/search.js +92 -0
  31. data/vendor/assets/javascripts/uikit/components/slider.js +552 -0
  32. data/vendor/assets/javascripts/uikit/components/slideset.js +523 -0
  33. data/vendor/assets/javascripts/uikit/components/slideshow-fx.js +383 -0
  34. data/vendor/assets/javascripts/uikit/components/slideshow.js +596 -0
  35. data/vendor/assets/javascripts/uikit/components/sortable.js +688 -0
  36. data/vendor/assets/javascripts/uikit/components/sticky.js +364 -0
  37. data/vendor/assets/javascripts/uikit/components/timepicker.js +192 -0
  38. data/vendor/assets/javascripts/uikit/components/tooltip.js +234 -0
  39. data/vendor/assets/javascripts/uikit/components/upload.js +262 -0
  40. data/vendor/assets/javascripts/uikit/core/alert.js +66 -0
  41. data/vendor/assets/javascripts/uikit/core/button.js +156 -0
  42. data/vendor/assets/javascripts/uikit/core/core.js +820 -0
  43. data/vendor/assets/javascripts/uikit/core/cover.js +95 -0
  44. data/vendor/assets/javascripts/uikit/core/dropdown.js +529 -0
  45. data/vendor/assets/javascripts/uikit/core/grid.js +117 -0
  46. data/vendor/assets/javascripts/uikit/core/modal.js +389 -0
  47. data/vendor/assets/javascripts/uikit/core/nav.js +152 -0
  48. data/vendor/assets/javascripts/uikit/core/offcanvas.js +197 -0
  49. data/vendor/assets/javascripts/uikit/core/scrollspy.js +209 -0
  50. data/vendor/assets/javascripts/uikit/core/smooth-scroll.js +62 -0
  51. data/vendor/assets/javascripts/uikit/core/switcher.js +309 -0
  52. data/vendor/assets/javascripts/uikit/core/tab.js +167 -0
  53. data/vendor/assets/javascripts/uikit/core/toggle.js +124 -0
  54. data/vendor/assets/javascripts/uikit/core/touch.js +175 -0
  55. data/vendor/assets/javascripts/uikit/core/utility.js +338 -0
  56. data/vendor/assets/javascripts/uikit/uikit.js +3905 -0
  57. data/vendor/assets/stylesheets/extra/font-awesome.scss +14 -0
  58. data/vendor/assets/stylesheets/uikit.scss +7 -0
  59. data/vendor/assets/stylesheets/uikit/components/accordion.scss +94 -0
  60. data/vendor/assets/stylesheets/uikit/components/autocomplete.scss +107 -0
  61. data/vendor/assets/stylesheets/uikit/components/datepicker.scss +197 -0
  62. data/vendor/assets/stylesheets/uikit/components/dotnav.scss +212 -0
  63. data/vendor/assets/stylesheets/uikit/components/form-advanced.scss +128 -0
  64. data/vendor/assets/stylesheets/uikit/components/form-file.scss +63 -0
  65. data/vendor/assets/stylesheets/uikit/components/form-password.scss +74 -0
  66. data/vendor/assets/stylesheets/uikit/components/form-select.scss +66 -0
  67. data/vendor/assets/stylesheets/uikit/components/htmleditor.scss +269 -0
  68. data/vendor/assets/stylesheets/uikit/components/nestable.scss +231 -0
  69. data/vendor/assets/stylesheets/uikit/components/notify.scss +190 -0
  70. data/vendor/assets/stylesheets/uikit/components/placeholder.scss +66 -0
  71. data/vendor/assets/stylesheets/uikit/components/progress.scss +173 -0
  72. data/vendor/assets/stylesheets/uikit/components/search.scss +309 -0
  73. data/vendor/assets/stylesheets/uikit/components/slidenav.scss +183 -0
  74. data/vendor/assets/stylesheets/uikit/components/slider.scss +139 -0
  75. data/vendor/assets/stylesheets/uikit/components/slideshow.scss +208 -0
  76. data/vendor/assets/stylesheets/uikit/components/sortable.scss +124 -0
  77. data/vendor/assets/stylesheets/uikit/components/sticky.scss +57 -0
  78. data/vendor/assets/stylesheets/uikit/components/tooltip.scss +177 -0
  79. data/vendor/assets/stylesheets/uikit/components/upload.scss +34 -0
  80. data/vendor/assets/stylesheets/uikit/core/alert.scss +141 -0
  81. data/vendor/assets/stylesheets/uikit/core/animation.scss +599 -0
  82. data/vendor/assets/stylesheets/uikit/core/article.scss +139 -0
  83. data/vendor/assets/stylesheets/uikit/core/badge.scss +110 -0
  84. data/vendor/assets/stylesheets/uikit/core/base.scss +563 -0
  85. data/vendor/assets/stylesheets/uikit/core/block.scss +155 -0
  86. data/vendor/assets/stylesheets/uikit/core/breadcrumb.scss +86 -0
  87. data/vendor/assets/stylesheets/uikit/core/button.scss +406 -0
  88. data/vendor/assets/stylesheets/uikit/core/close.scss +132 -0
  89. data/vendor/assets/stylesheets/uikit/core/column.scss +209 -0
  90. data/vendor/assets/stylesheets/uikit/core/comment.scss +172 -0
  91. data/vendor/assets/stylesheets/uikit/core/contrast.scss +493 -0
  92. data/vendor/assets/stylesheets/uikit/core/cover.scss +70 -0
  93. data/vendor/assets/stylesheets/uikit/core/description-list.scss +71 -0
  94. data/vendor/assets/stylesheets/uikit/core/dropdown.scss +280 -0
  95. data/vendor/assets/stylesheets/uikit/core/flex.scss +320 -0
  96. data/vendor/assets/stylesheets/uikit/core/form.scss +629 -0
  97. data/vendor/assets/stylesheets/uikit/core/grid.scss +731 -0
  98. data/vendor/assets/stylesheets/uikit/core/icon.scss +930 -0
  99. data/vendor/assets/stylesheets/uikit/core/list.scss +102 -0
  100. data/vendor/assets/stylesheets/uikit/core/modal.scss +343 -0
  101. data/vendor/assets/stylesheets/uikit/core/nav.scss +468 -0
  102. data/vendor/assets/stylesheets/uikit/core/navbar.scss +325 -0
  103. data/vendor/assets/stylesheets/uikit/core/offcanvas.scss +203 -0
  104. data/vendor/assets/stylesheets/uikit/core/overlay.scss +534 -0
  105. data/vendor/assets/stylesheets/uikit/core/pagination.scss +197 -0
  106. data/vendor/assets/stylesheets/uikit/core/panel.scss +332 -0
  107. data/vendor/assets/stylesheets/uikit/core/print.scss +61 -0
  108. data/vendor/assets/stylesheets/uikit/core/subnav.scss +213 -0
  109. data/vendor/assets/stylesheets/uikit/core/switcher.scss +38 -0
  110. data/vendor/assets/stylesheets/uikit/core/tab.scss +368 -0
  111. data/vendor/assets/stylesheets/uikit/core/table.scss +147 -0
  112. data/vendor/assets/stylesheets/uikit/core/text.scss +136 -0
  113. data/vendor/assets/stylesheets/uikit/core/thumbnail.scss +122 -0
  114. data/vendor/assets/stylesheets/uikit/core/thumbnav.scss +122 -0
  115. data/vendor/assets/stylesheets/uikit/core/utility.scss +610 -0
  116. data/vendor/assets/stylesheets/uikit/core/variables.scss +23 -0
  117. data/vendor/assets/stylesheets/uikit/uikit-mixins.scss +327 -0
  118. data/vendor/assets/stylesheets/uikit/uikit-variables.scss +819 -0
  119. data/vendor/assets/stylesheets/uikit/uikit.scss +52 -0
  120. metadata +177 -0
@@ -0,0 +1,688 @@
1
+ /*! UIkit 2.27.1 | http://www.getuikit.com | (c) 2014 YOOtheme | MIT License */
2
+ /*
3
+ * Based on nativesortable - Copyright (c) Brian Grinstead - https://github.com/bgrins/nativesortable
4
+ */
5
+ (function(addon) {
6
+
7
+ var component;
8
+
9
+ if (window.UIkit) {
10
+ component = addon(UIkit);
11
+ }
12
+
13
+ if (typeof define == "function" && define.amd) {
14
+ define("uikit-sortable", ["uikit"], function(){
15
+ return component || addon(UIkit);
16
+ });
17
+ }
18
+
19
+ })(function(UI){
20
+
21
+ "use strict";
22
+
23
+ var supportsTouch = ('ontouchstart' in window || 'MSGesture' in window) || (window.DocumentTouch && document instanceof DocumentTouch),
24
+ draggingPlaceholder, currentlyDraggingElement, currentlyDraggingTarget, dragging, moving, clickedlink, delayIdle, touchedlists, moved, overElement, startEvent;
25
+
26
+ var POINTER_DOWN = supportsTouch ? ('MSGesture' in window ? 'pointerdown':'touchstart') : 'mousedown',
27
+ POINTER_MOVE = supportsTouch ? ('MSGesture' in window ? 'pointermove':'touchmove') : 'mousemove',
28
+ POINTER_UP = supportsTouch ? ('MSGesture' in window ? 'pointerup':'touchend') : 'mouseup';
29
+
30
+ function closestSortable(ele) {
31
+
32
+ ele = UI.$(ele);
33
+
34
+ do {
35
+ if (ele.data('sortable')) {
36
+ return ele;
37
+ }
38
+ ele = UI.$(ele).parent();
39
+ } while(ele.length);
40
+
41
+ return ele;
42
+ }
43
+
44
+ UI.component('sortable', {
45
+
46
+ defaults: {
47
+
48
+ animation : 150,
49
+ threshold : 10,
50
+
51
+ childClass : 'uk-sortable-item',
52
+ placeholderClass : 'uk-sortable-placeholder',
53
+ overClass : 'uk-sortable-over',
54
+ draggingClass : 'uk-sortable-dragged',
55
+ dragMovingClass : 'uk-sortable-moving',
56
+ baseClass : 'uk-sortable',
57
+ noDragClass : 'uk-sortable-nodrag',
58
+ emptyClass : 'uk-sortable-empty',
59
+ dragCustomClass : '',
60
+ handleClass : false,
61
+ group : false,
62
+
63
+ stop : function() {},
64
+ start : function() {},
65
+ change : function() {}
66
+ },
67
+
68
+ boot: function() {
69
+
70
+ // auto init
71
+ UI.ready(function(context) {
72
+
73
+ UI.$("[data-uk-sortable]", context).each(function(){
74
+
75
+ var ele = UI.$(this);
76
+
77
+ if(!ele.data("sortable")) {
78
+ UI.sortable(ele, UI.Utils.options(ele.attr("data-uk-sortable")));
79
+ }
80
+ });
81
+ });
82
+
83
+ UI.$html.on(POINTER_MOVE, function(e) {
84
+
85
+ if (delayIdle) {
86
+
87
+ var src = e.originalEvent.targetTouches ? e.originalEvent.targetTouches[0] : e;
88
+
89
+ if (Math.abs(src.pageX - delayIdle.pos.x) > delayIdle.threshold || Math.abs(src.pageY - delayIdle.pos.y) > delayIdle.threshold) {
90
+ delayIdle.apply(src);
91
+ }
92
+ }
93
+
94
+ if (draggingPlaceholder) {
95
+
96
+ if (!moving) {
97
+ moving = true;
98
+ draggingPlaceholder.show();
99
+
100
+ draggingPlaceholder.$current.addClass(draggingPlaceholder.$sortable.options.placeholderClass);
101
+ draggingPlaceholder.$sortable.element.children().addClass(draggingPlaceholder.$sortable.options.childClass);
102
+
103
+ UI.$html.addClass(draggingPlaceholder.$sortable.options.dragMovingClass);
104
+ }
105
+
106
+ var offset = draggingPlaceholder.data('mouse-offset'),
107
+ ev = e.originalEvent.touches && e.originalEvent.touches[0] || e.originalEvent,
108
+ left = parseInt(ev.pageX, 10) + offset.left,
109
+ top = parseInt(ev.pageY, 10) + offset.top;
110
+
111
+ draggingPlaceholder.css({'left': left, 'top': top });
112
+
113
+ // adjust document scrolling
114
+
115
+ if (top + (draggingPlaceholder.height()/3) > document.body.offsetHeight) {
116
+ return;
117
+ }
118
+
119
+ if (top < UI.$win.scrollTop()) {
120
+ UI.$win.scrollTop(UI.$win.scrollTop() - Math.ceil(draggingPlaceholder.height()/3));
121
+ } else if ( (top + (draggingPlaceholder.height()/3)) > (window.innerHeight + UI.$win.scrollTop()) ) {
122
+ UI.$win.scrollTop(UI.$win.scrollTop() + Math.ceil(draggingPlaceholder.height()/3));
123
+ }
124
+ }
125
+ });
126
+
127
+ UI.$html.on(POINTER_UP, function(e) {
128
+
129
+ delayIdle = clickedlink = false;
130
+
131
+ // dragging?
132
+ if (!currentlyDraggingElement || !draggingPlaceholder) {
133
+ // completely reset dragging attempt. will cause weird delay behavior elsewise
134
+ currentlyDraggingElement = draggingPlaceholder = null;
135
+ return;
136
+ }
137
+
138
+ // inside or outside of sortable?
139
+ var sortable = closestSortable(currentlyDraggingElement),
140
+ component = draggingPlaceholder.$sortable,
141
+ ev = { type: e.type };
142
+
143
+ if (sortable[0]) {
144
+ component.dragDrop(ev, component.element);
145
+ }
146
+ component.dragEnd(ev, component.element);
147
+ });
148
+ },
149
+
150
+ init: function() {
151
+
152
+ var $this = this,
153
+ element = this.element[0];
154
+
155
+ touchedlists = [];
156
+
157
+ this.checkEmptyList();
158
+
159
+ this.element.data('sortable-group', this.options.group ? this.options.group : UI.Utils.uid('sortable-group'));
160
+
161
+ var handleDragStart = delegate(function(e) {
162
+
163
+ if (e.data && e.data.sortable) {
164
+ return;
165
+ }
166
+
167
+ var $target = UI.$(e.target),
168
+ $link = $target.is('a[href]') ? $target:$target.parents('a[href]');
169
+
170
+ if ($target.is(':input')) {
171
+ return;
172
+ }
173
+
174
+ if ($this.options.handleClass) {
175
+ var handle = $target.hasClass($this.options.handleClass) ? $target : $target.closest('.'+$this.options.handleClass, $this.element);
176
+ if (!handle.length) return;
177
+ }
178
+
179
+ e.preventDefault();
180
+
181
+ if ($link.length) {
182
+
183
+ $link.one('click', function(e){
184
+ e.preventDefault();
185
+ }).one(POINTER_UP, function(){
186
+
187
+ if (!moved) {
188
+ $link.trigger('click');
189
+ if (supportsTouch && $link.attr('href').trim()) {
190
+ location.href = $link.attr('href');
191
+ }
192
+ }
193
+ });
194
+ }
195
+
196
+ e.data = e.data || {};
197
+
198
+ e.data.sortable = element;
199
+
200
+ return $this.dragStart(e, this);
201
+ });
202
+
203
+ var handleDragEnter = delegate(UI.Utils.debounce(function(e) {
204
+ return $this.dragEnter(e, this);
205
+ }), 40);
206
+
207
+ var handleDragLeave = delegate(function(e) {
208
+
209
+ // Prevent dragenter on a child from allowing a dragleave on the container
210
+ var previousCounter = $this.dragenterData(this);
211
+ $this.dragenterData(this, previousCounter - 1);
212
+
213
+ // This is a fix for child elements firing dragenter before the parent fires dragleave
214
+ if (!$this.dragenterData(this)) {
215
+ UI.$(this).removeClass($this.options.overClass);
216
+ $this.dragenterData(this, false);
217
+ }
218
+ });
219
+
220
+ var handleTouchMove = delegate(function(e) {
221
+
222
+ if (!currentlyDraggingElement ||
223
+ currentlyDraggingElement === this ||
224
+ currentlyDraggingTarget === this) {
225
+ return true;
226
+ }
227
+
228
+ $this.element.children().removeClass($this.options.overClass);
229
+ currentlyDraggingTarget = this;
230
+
231
+ $this.moveElementNextTo(currentlyDraggingElement, this);
232
+
233
+ return prevent(e);
234
+ });
235
+
236
+ // Bind/unbind standard mouse/touch events as a polyfill.
237
+ function addDragHandlers() {
238
+
239
+ if (supportsTouch && startEvent.touches && startEvent.touches.length) {
240
+ element.addEventListener(POINTER_MOVE, handleTouchMove, false);
241
+ } else {
242
+ element.addEventListener('mouseover', handleDragEnter, false);
243
+ element.addEventListener('mouseout', handleDragLeave, false);
244
+ }
245
+
246
+ // document.addEventListener("selectstart", prevent, false);
247
+ }
248
+
249
+ function removeDragHandlers() {
250
+ if (supportsTouch && startEvent.touches && startEvent.touches.length) {
251
+ element.removeEventListener(POINTER_MOVE, handleTouchMove, false);
252
+ } else {
253
+ element.removeEventListener('mouseover', handleDragEnter, false);
254
+ element.removeEventListener('mouseout', handleDragLeave, false);
255
+ }
256
+
257
+ // document.removeEventListener("selectstart", prevent, false);
258
+ }
259
+
260
+ this.addDragHandlers = addDragHandlers;
261
+ this.removeDragHandlers = removeDragHandlers;
262
+
263
+ function handleDragMove(e) {
264
+
265
+ if (!currentlyDraggingElement) {
266
+ return;
267
+ }
268
+
269
+ $this.dragMove(e, $this);
270
+ }
271
+
272
+ function delegate(fn) {
273
+
274
+ return function(e) {
275
+
276
+ var touch, target, context;
277
+
278
+ startEvent = e;
279
+
280
+ if (e) {
281
+ touch = e.touches && e.touches[0] || e;
282
+ target = touch.target || e.target;
283
+
284
+ // Fix event.target for a touch event
285
+ if (supportsTouch && document.elementFromPoint) {
286
+ target = document.elementFromPoint(touch.pageX - document.body.scrollLeft, touch.pageY - document.body.scrollTop);
287
+ }
288
+
289
+ overElement = UI.$(target);
290
+ }
291
+
292
+ if (UI.$(target).hasClass('.'+$this.options.childClass)) {
293
+ fn.apply(target, [e]);
294
+ } else if (target !== element) {
295
+
296
+ // If a child is initiating the event or ending it, then use the container as context for the callback.
297
+ context = moveUpToChildNode(element, target);
298
+
299
+ if (context) {
300
+ fn.apply(context, [e]);
301
+ }
302
+ }
303
+ };
304
+ }
305
+
306
+ window.addEventListener(POINTER_MOVE, handleDragMove, false);
307
+ element.addEventListener(POINTER_DOWN, handleDragStart, false);
308
+ },
309
+
310
+ dragStart: function(e, elem) {
311
+
312
+ moved = false;
313
+ moving = false;
314
+ dragging = false;
315
+
316
+ var $this = this,
317
+ target = UI.$(e.target);
318
+
319
+ if (!supportsTouch && e.button==2) {
320
+ return;
321
+ }
322
+
323
+ if (target.is('.'+$this.options.noDragClass) || target.closest('.'+$this.options.noDragClass).length) {
324
+ return;
325
+ }
326
+
327
+ // prevent dragging if taget is a form field
328
+ if (target.is(':input')) {
329
+ return;
330
+ }
331
+
332
+ currentlyDraggingElement = elem;
333
+
334
+ // init drag placeholder
335
+ if (draggingPlaceholder) {
336
+ draggingPlaceholder.remove();
337
+ }
338
+
339
+ var $current = UI.$(currentlyDraggingElement), offset = $current.offset(), ev = e.touches && e.touches[0] || e;
340
+
341
+ delayIdle = {
342
+
343
+ pos : { x:ev.pageX, y:ev.pageY },
344
+ threshold : $this.options.handleClass ? 1 : $this.options.threshold,
345
+ apply : function(evt) {
346
+
347
+ draggingPlaceholder = UI.$('<div class="'+([$this.options.draggingClass, $this.options.dragCustomClass].join(' '))+'"></div>').css({
348
+ display : 'none',
349
+ top : offset.top,
350
+ left : offset.left,
351
+ width : $current.width(),
352
+ height : $current.height(),
353
+ padding : $current.css('padding')
354
+ }).data({
355
+ 'mouse-offset': {
356
+ 'left' : offset.left - parseInt(ev.pageX, 10),
357
+ 'top' : offset.top - parseInt(ev.pageY, 10)
358
+ },
359
+ 'origin' : $this.element,
360
+ 'index' : $current.index()
361
+ }).append($current.html()).appendTo('body');
362
+
363
+ draggingPlaceholder.$current = $current;
364
+ draggingPlaceholder.$sortable = $this;
365
+
366
+ $current.data({
367
+ 'start-list': $current.parent(),
368
+ 'start-index': $current.index(),
369
+ 'sortable-group': $this.options.group
370
+ });
371
+
372
+ $this.addDragHandlers();
373
+
374
+ $this.options.start(this, currentlyDraggingElement);
375
+ $this.trigger('start.uk.sortable', [$this, currentlyDraggingElement, draggingPlaceholder]);
376
+
377
+ moved = true;
378
+ delayIdle = false;
379
+ }
380
+ };
381
+ },
382
+
383
+ dragMove: function(e, elem) {
384
+
385
+ overElement = UI.$(document.elementFromPoint(e.pageX - (document.body.scrollLeft || document.scrollLeft || 0), e.pageY - (document.body.scrollTop || document.documentElement.scrollTop || 0)));
386
+
387
+ var overRoot = overElement.closest('.'+this.options.baseClass),
388
+ groupOver = overRoot.data("sortable-group"),
389
+ $current = UI.$(currentlyDraggingElement),
390
+ currentRoot = $current.parent(),
391
+ groupCurrent = $current.data("sortable-group"),
392
+ overChild;
393
+
394
+ if (overRoot[0] !== currentRoot[0] && groupCurrent !== undefined && groupOver === groupCurrent) {
395
+
396
+ overRoot.data('sortable').addDragHandlers();
397
+
398
+ touchedlists.push(overRoot);
399
+ overRoot.children().addClass(this.options.childClass);
400
+
401
+ // swap root
402
+ if (overRoot.children().length > 0) {
403
+ overChild = overElement.closest('.'+this.options.childClass);
404
+
405
+ if (overChild.length) {
406
+ overChild.before($current);
407
+ } else {
408
+ overRoot.append($current);
409
+ }
410
+
411
+ } else { // empty list
412
+ overElement.append($current);
413
+ }
414
+
415
+ UIkit.$doc.trigger('mouseover');
416
+ }
417
+
418
+ this.checkEmptyList();
419
+ this.checkEmptyList(currentRoot);
420
+ },
421
+
422
+ dragEnter: function(e, elem) {
423
+
424
+ if (!currentlyDraggingElement || currentlyDraggingElement === elem) {
425
+ return true;
426
+ }
427
+
428
+ var previousCounter = this.dragenterData(elem);
429
+
430
+ this.dragenterData(elem, previousCounter + 1);
431
+
432
+ // Prevent dragenter on a child from allowing a dragleave on the container
433
+ if (previousCounter === 0) {
434
+
435
+ var currentlist = UI.$(elem).parent(),
436
+ startlist = UI.$(currentlyDraggingElement).data("start-list");
437
+
438
+ if (currentlist[0] !== startlist[0]) {
439
+
440
+ var groupOver = currentlist.data('sortable-group'),
441
+ groupCurrent = UI.$(currentlyDraggingElement).data("sortable-group");
442
+
443
+ if ((groupOver || groupCurrent) && (groupOver != groupCurrent)) {
444
+ return false;
445
+ }
446
+ }
447
+
448
+ UI.$(elem).addClass(this.options.overClass);
449
+ this.moveElementNextTo(currentlyDraggingElement, elem);
450
+ }
451
+
452
+ return false;
453
+ },
454
+
455
+ dragEnd: function(e, elem) {
456
+
457
+ var $this = this;
458
+
459
+ // avoid triggering event twice
460
+ if (currentlyDraggingElement) {
461
+ // TODO: trigger on right element?
462
+ this.options.stop(elem);
463
+ this.trigger('stop.uk.sortable', [this]);
464
+ }
465
+
466
+ currentlyDraggingElement = null;
467
+ currentlyDraggingTarget = null;
468
+
469
+ touchedlists.push(this.element);
470
+ touchedlists.forEach(function(el, i) {
471
+ UI.$(el).children().each(function() {
472
+ if (this.nodeType === 1) {
473
+ UI.$(this).removeClass($this.options.overClass)
474
+ .removeClass($this.options.placeholderClass)
475
+ .removeClass($this.options.childClass);
476
+ $this.dragenterData(this, false);
477
+ }
478
+ });
479
+ });
480
+
481
+ touchedlists = [];
482
+
483
+ UI.$html.removeClass(this.options.dragMovingClass);
484
+
485
+ this.removeDragHandlers();
486
+
487
+ if (draggingPlaceholder) {
488
+ draggingPlaceholder.remove();
489
+ draggingPlaceholder = null;
490
+ }
491
+ },
492
+
493
+ dragDrop: function(e, elem) {
494
+
495
+ if (e.type === 'drop') {
496
+
497
+ if (e.stopPropagation) {
498
+ e.stopPropagation();
499
+ }
500
+
501
+ if (e.preventDefault) {
502
+ e.preventDefault();
503
+ }
504
+ }
505
+
506
+ this.triggerChangeEvents();
507
+ },
508
+
509
+ triggerChangeEvents: function() {
510
+
511
+ // trigger events once
512
+ if (!currentlyDraggingElement) return;
513
+
514
+ var $current = UI.$(currentlyDraggingElement),
515
+ oldRoot = draggingPlaceholder.data("origin"),
516
+ newRoot = $current.closest('.'+this.options.baseClass),
517
+ triggers = [],
518
+ el = UI.$(currentlyDraggingElement);
519
+
520
+ // events depending on move inside lists or across lists
521
+ if (oldRoot[0] === newRoot[0] && draggingPlaceholder.data('index') != $current.index() ) {
522
+ triggers.push({sortable: this, mode: 'moved'});
523
+ } else if (oldRoot[0] != newRoot[0]) {
524
+ triggers.push({sortable: UI.$(newRoot).data('sortable'), mode: 'added'}, {sortable: UI.$(oldRoot).data('sortable'), mode: 'removed'});
525
+ }
526
+
527
+ triggers.forEach(function (trigger, i) {
528
+ if (trigger.sortable) {
529
+ trigger.sortable.element.trigger('change.uk.sortable', [trigger.sortable, el, trigger.mode]);
530
+ }
531
+ });
532
+ },
533
+
534
+ dragenterData: function(element, val) {
535
+
536
+ element = UI.$(element);
537
+
538
+ if (arguments.length == 1) {
539
+ return parseInt(element.data('child-dragenter'), 10) || 0;
540
+ } else if (!val) {
541
+ element.removeData('child-dragenter');
542
+ } else {
543
+ element.data('child-dragenter', Math.max(0, val));
544
+ }
545
+ },
546
+
547
+ moveElementNextTo: function(element, elementToMoveNextTo) {
548
+
549
+ dragging = true;
550
+
551
+ var $this = this,
552
+ list = UI.$(element).parent().css('min-height', ''),
553
+ next = isBelow(element, elementToMoveNextTo) ? elementToMoveNextTo : elementToMoveNextTo.nextSibling,
554
+ children = list.children(),
555
+ count = children.length;
556
+
557
+ if (!$this.options.animation) {
558
+ elementToMoveNextTo.parentNode.insertBefore(element, next);
559
+ UI.Utils.checkDisplay($this.element.parent());
560
+ return;
561
+ }
562
+
563
+ list.css('min-height', list.height());
564
+
565
+ children.stop().each(function(){
566
+ var ele = UI.$(this),
567
+ offset = ele.position();
568
+
569
+ offset.width = ele.width();
570
+
571
+ ele.data('offset-before', offset);
572
+ });
573
+
574
+ elementToMoveNextTo.parentNode.insertBefore(element, next);
575
+
576
+ UI.Utils.checkDisplay($this.element.parent());
577
+
578
+ children = list.children().each(function() {
579
+ var ele = UI.$(this);
580
+ ele.data('offset-after', ele.position());
581
+ }).each(function() {
582
+ var ele = UI.$(this),
583
+ before = ele.data('offset-before');
584
+ ele.css({'position':'absolute', 'top':before.top, 'left':before.left, 'min-width':before.width });
585
+ });
586
+
587
+ children.each(function(){
588
+
589
+ var ele = UI.$(this),
590
+ before = ele.data('offset-before'),
591
+ offset = ele.data('offset-after');
592
+
593
+ ele.css('pointer-events', 'none').width();
594
+
595
+ setTimeout(function(){
596
+ ele.animate({'top':offset.top, 'left':offset.left}, $this.options.animation, function() {
597
+ ele.css({'position':'','top':'', 'left':'', 'min-width': '', 'pointer-events':''}).removeClass($this.options.overClass).removeData('child-dragenter');
598
+ count--;
599
+ if (!count) {
600
+ list.css('min-height', '');
601
+ UI.Utils.checkDisplay($this.element.parent());
602
+ }
603
+ });
604
+ }, 0);
605
+ });
606
+ },
607
+
608
+ serialize: function() {
609
+
610
+ var data = [], item, attribute;
611
+
612
+ this.element.children().each(function(j, child) {
613
+ item = {};
614
+ for (var i = 0, attr, val; i < child.attributes.length; i++) {
615
+ attribute = child.attributes[i];
616
+ if (attribute.name.indexOf('data-') === 0) {
617
+ attr = attribute.name.substr(5);
618
+ val = UI.Utils.str2json(attribute.value);
619
+ item[attr] = (val || attribute.value=='false' || attribute.value=='0') ? val:attribute.value;
620
+ }
621
+ }
622
+ data.push(item);
623
+ });
624
+
625
+ return data;
626
+ },
627
+
628
+ checkEmptyList: function(list) {
629
+
630
+ list = list ? UI.$(list) : this.element;
631
+
632
+ if (this.options.emptyClass) {
633
+ list[!list.children().length ? 'addClass':'removeClass'](this.options.emptyClass);
634
+ }
635
+ }
636
+ });
637
+
638
+ // helpers
639
+
640
+ function isBelow(el1, el2) {
641
+
642
+ var parent = el1.parentNode;
643
+
644
+ if (el2.parentNode != parent) {
645
+ return false;
646
+ }
647
+
648
+ var cur = el1.previousSibling;
649
+
650
+ while (cur && cur.nodeType !== 9) {
651
+ if (cur === el2) {
652
+ return true;
653
+ }
654
+ cur = cur.previousSibling;
655
+ }
656
+
657
+ return false;
658
+ }
659
+
660
+ function moveUpToChildNode(parent, child) {
661
+ var cur = child;
662
+ if (cur == parent) { return null; }
663
+
664
+ while (cur) {
665
+ if (cur.parentNode === parent) {
666
+ return cur;
667
+ }
668
+
669
+ cur = cur.parentNode;
670
+ if ( !cur || !cur.ownerDocument || cur.nodeType === 11 ) {
671
+ break;
672
+ }
673
+ }
674
+ return null;
675
+ }
676
+
677
+ function prevent(e) {
678
+ if (e.stopPropagation) {
679
+ e.stopPropagation();
680
+ }
681
+ if (e.preventDefault) {
682
+ e.preventDefault();
683
+ }
684
+ e.returnValue = false;
685
+ }
686
+
687
+ return UI.sortable;
688
+ });