uikit-sass-rails 1.3.0 → 1.4.0

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