govuk_publishing_components 30.2.0 → 30.4.0

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.
Files changed (23) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/govuk_publishing_components/analytics/page-content.js +8 -0
  3. data/app/assets/javascripts/govuk_publishing_components/analytics-ga4/ga4-event-tracker.js +6 -6
  4. data/app/assets/javascripts/govuk_publishing_components/analytics-ga4/ga4-link-tracker.js +23 -5
  5. data/app/assets/javascripts/govuk_publishing_components/components/checkboxes.js +0 -22
  6. data/app/assets/stylesheets/component_guide/application.scss +4 -0
  7. data/app/assets/stylesheets/govuk_publishing_components/components/_layout-footer.scss +7 -0
  8. data/app/assets/stylesheets/govuk_publishing_components/components/_layout-super-navigation-header.scss +1 -1
  9. data/app/models/govuk_publishing_components/component_example.rb +3 -2
  10. data/app/views/govuk_publishing_components/component_guide/show.html.erb +26 -2
  11. data/app/views/govuk_publishing_components/components/_checkboxes.html.erb +2 -3
  12. data/app/views/govuk_publishing_components/components/docs/textarea.yml +7 -0
  13. data/config/locales/en.yml +4 -0
  14. data/lib/govuk_publishing_components/presenters/checkboxes_helper.rb +2 -4
  15. data/lib/govuk_publishing_components/version.rb +1 -1
  16. data/node_modules/sortablejs/README.md +828 -815
  17. data/node_modules/sortablejs/Sortable.js +186 -113
  18. data/node_modules/sortablejs/Sortable.min.js +2 -2
  19. data/node_modules/sortablejs/modular/sortable.complete.esm.js +184 -111
  20. data/node_modules/sortablejs/modular/sortable.core.esm.js +184 -111
  21. data/node_modules/sortablejs/modular/sortable.esm.js +184 -111
  22. data/node_modules/sortablejs/package.json +3 -3
  23. metadata +17 -3
@@ -1,10 +1,50 @@
1
1
  /**!
2
- * Sortable 1.13.0
2
+ * Sortable 1.15.0
3
3
  * @author RubaXa <trash@rubaxa.org>
4
4
  * @author owenm <owen23355@gmail.com>
5
5
  * @license MIT
6
6
  */
7
+ function ownKeys(object, enumerableOnly) {
8
+ var keys = Object.keys(object);
9
+
10
+ if (Object.getOwnPropertySymbols) {
11
+ var symbols = Object.getOwnPropertySymbols(object);
12
+
13
+ if (enumerableOnly) {
14
+ symbols = symbols.filter(function (sym) {
15
+ return Object.getOwnPropertyDescriptor(object, sym).enumerable;
16
+ });
17
+ }
18
+
19
+ keys.push.apply(keys, symbols);
20
+ }
21
+
22
+ return keys;
23
+ }
24
+
25
+ function _objectSpread2(target) {
26
+ for (var i = 1; i < arguments.length; i++) {
27
+ var source = arguments[i] != null ? arguments[i] : {};
28
+
29
+ if (i % 2) {
30
+ ownKeys(Object(source), true).forEach(function (key) {
31
+ _defineProperty(target, key, source[key]);
32
+ });
33
+ } else if (Object.getOwnPropertyDescriptors) {
34
+ Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
35
+ } else {
36
+ ownKeys(Object(source)).forEach(function (key) {
37
+ Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
38
+ });
39
+ }
40
+ }
41
+
42
+ return target;
43
+ }
44
+
7
45
  function _typeof(obj) {
46
+ "@babel/helpers - typeof";
47
+
8
48
  if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
9
49
  _typeof = function (obj) {
10
50
  return typeof obj;
@@ -51,25 +91,6 @@ function _extends() {
51
91
  return _extends.apply(this, arguments);
52
92
  }
53
93
 
54
- function _objectSpread(target) {
55
- for (var i = 1; i < arguments.length; i++) {
56
- var source = arguments[i] != null ? arguments[i] : {};
57
- var ownKeys = Object.keys(source);
58
-
59
- if (typeof Object.getOwnPropertySymbols === 'function') {
60
- ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {
61
- return Object.getOwnPropertyDescriptor(source, sym).enumerable;
62
- }));
63
- }
64
-
65
- ownKeys.forEach(function (key) {
66
- _defineProperty(target, key, source[key]);
67
- });
68
- }
69
-
70
- return target;
71
- }
72
-
73
94
  function _objectWithoutPropertiesLoose(source, excluded) {
74
95
  if (source == null) return {};
75
96
  var target = {};
@@ -107,32 +128,43 @@ function _objectWithoutProperties(source, excluded) {
107
128
  }
108
129
 
109
130
  function _toConsumableArray(arr) {
110
- return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread();
131
+ return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();
111
132
  }
112
133
 
113
134
  function _arrayWithoutHoles(arr) {
114
- if (Array.isArray(arr)) {
115
- for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];
116
-
117
- return arr2;
118
- }
135
+ if (Array.isArray(arr)) return _arrayLikeToArray(arr);
119
136
  }
120
137
 
121
138
  function _iterableToArray(iter) {
122
- if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter);
139
+ if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
140
+ }
141
+
142
+ function _unsupportedIterableToArray(o, minLen) {
143
+ if (!o) return;
144
+ if (typeof o === "string") return _arrayLikeToArray(o, minLen);
145
+ var n = Object.prototype.toString.call(o).slice(8, -1);
146
+ if (n === "Object" && o.constructor) n = o.constructor.name;
147
+ if (n === "Map" || n === "Set") return Array.from(o);
148
+ if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
149
+ }
150
+
151
+ function _arrayLikeToArray(arr, len) {
152
+ if (len == null || len > arr.length) len = arr.length;
153
+
154
+ for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
155
+
156
+ return arr2;
123
157
  }
124
158
 
125
159
  function _nonIterableSpread() {
126
- throw new TypeError("Invalid attempt to spread non-iterable instance");
160
+ throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
127
161
  }
128
162
 
129
- var version = "1.13.0";
163
+ var version = "1.15.0";
130
164
 
131
165
  function userAgent(pattern) {
132
166
  if (typeof window !== 'undefined' && window.navigator) {
133
- return !!
134
- /*@__PURE__*/
135
- navigator.userAgent.match(pattern);
167
+ return !! /*@__PURE__*/navigator.userAgent.match(pattern);
136
168
  }
137
169
  }
138
170
 
@@ -413,13 +445,13 @@ function isScrolledPast(el, elSide, parentSide) {
413
445
  */
414
446
 
415
447
 
416
- function getChild(el, childNum, options) {
448
+ function getChild(el, childNum, options, includeDragEl) {
417
449
  var currentChild = 0,
418
450
  i = 0,
419
451
  children = el.children;
420
452
 
421
453
  while (i < children.length) {
422
- if (children[i].style.display !== 'none' && children[i] !== Sortable.ghost && children[i] !== Sortable.dragged && closest(children[i], options.draggable, el, false)) {
454
+ if (children[i].style.display !== 'none' && children[i] !== Sortable.ghost && (includeDragEl || children[i] !== Sortable.dragged) && closest(children[i], options.draggable, el, false)) {
423
455
  if (currentChild === childNum) {
424
456
  return children[i];
425
457
  }
@@ -637,7 +669,7 @@ function AnimationStateManager() {
637
669
  rect: getRect(child)
638
670
  });
639
671
 
640
- var fromRect = _objectSpread({}, animationStates[animationStates.length - 1].rect); // If animating: compensate for current animation
672
+ var fromRect = _objectSpread2({}, animationStates[animationStates.length - 1].rect); // If animating: compensate for current animation
641
673
 
642
674
 
643
675
  if (child.thisAnimationDuration) {
@@ -807,7 +839,7 @@ var PluginManager = {
807
839
  if (!sortable[plugin.pluginName]) return; // Fire global events if it exists in this sortable
808
840
 
809
841
  if (sortable[plugin.pluginName][eventNameGlobal]) {
810
- sortable[plugin.pluginName][eventNameGlobal](_objectSpread({
842
+ sortable[plugin.pluginName][eventNameGlobal](_objectSpread2({
811
843
  sortable: sortable
812
844
  }, evt));
813
845
  } // Only fire plugin event if plugin is enabled in this sortable,
@@ -815,7 +847,7 @@ var PluginManager = {
815
847
 
816
848
 
817
849
  if (sortable.options[plugin.pluginName] && sortable[plugin.pluginName][eventName]) {
818
- sortable[plugin.pluginName][eventName](_objectSpread({
850
+ sortable[plugin.pluginName][eventName](_objectSpread2({
819
851
  sortable: sortable
820
852
  }, evt));
821
853
  }
@@ -907,7 +939,7 @@ function dispatchEvent(_ref) {
907
939
  evt.originalEvent = originalEvent;
908
940
  evt.pullMode = putSortable ? putSortable.lastPutMode : undefined;
909
941
 
910
- var allEventProperties = _objectSpread({}, extraEventProperties, PluginManager.getEventProperties(name, sortable));
942
+ var allEventProperties = _objectSpread2(_objectSpread2({}, extraEventProperties), PluginManager.getEventProperties(name, sortable));
911
943
 
912
944
  for (var option in allEventProperties) {
913
945
  evt[option] = allEventProperties[option];
@@ -922,12 +954,14 @@ function dispatchEvent(_ref) {
922
954
  }
923
955
  }
924
956
 
957
+ var _excluded = ["evt"];
958
+
925
959
  var pluginEvent = function pluginEvent(eventName, sortable) {
926
960
  var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
927
961
  originalEvent = _ref.evt,
928
- data = _objectWithoutProperties(_ref, ["evt"]);
962
+ data = _objectWithoutProperties(_ref, _excluded);
929
963
 
930
- PluginManager.pluginEvent.bind(Sortable)(eventName, sortable, _objectSpread({
964
+ PluginManager.pluginEvent.bind(Sortable)(eventName, sortable, _objectSpread2({
931
965
  dragEl: dragEl,
932
966
  parentEl: parentEl,
933
967
  ghostEl: ghostEl,
@@ -963,7 +997,7 @@ var pluginEvent = function pluginEvent(eventName, sortable) {
963
997
  };
964
998
 
965
999
  function _dispatchEvent(info) {
966
- dispatchEvent(_objectSpread({
1000
+ dispatchEvent(_objectSpread2({
967
1001
  putSortable: putSortable,
968
1002
  cloneEl: cloneEl,
969
1003
  targetEl: dragEl,
@@ -1063,22 +1097,22 @@ supportDraggable = documentExists && !ChromeForAndroid && !IOS && 'draggable' in
1063
1097
  return dragElS1Opp === targetS1Opp || dragElS2Opp === targetS2Opp || dragElS1Opp + dragElOppLength / 2 === targetS1Opp + targetOppLength / 2;
1064
1098
  },
1065
1099
 
1066
- /**
1067
- * Detects first nearest empty sortable to X and Y position using emptyInsertThreshold.
1068
- * @param {Number} x X position
1069
- * @param {Number} y Y position
1070
- * @return {HTMLElement} Element of the first found nearest Sortable
1100
+ /**
1101
+ * Detects first nearest empty sortable to X and Y position using emptyInsertThreshold.
1102
+ * @param {Number} x X position
1103
+ * @param {Number} y Y position
1104
+ * @return {HTMLElement} Element of the first found nearest Sortable
1071
1105
  */
1072
1106
  _detectNearestEmptySortable = function _detectNearestEmptySortable(x, y) {
1073
1107
  var ret;
1074
1108
  sortables.some(function (sortable) {
1075
- if (lastChild(sortable)) return;
1109
+ var threshold = sortable[expando].options.emptyInsertThreshold;
1110
+ if (!threshold || lastChild(sortable)) return;
1076
1111
  var rect = getRect(sortable),
1077
- threshold = sortable[expando].options.emptyInsertThreshold,
1078
1112
  insideHorizontally = x >= rect.left - threshold && x <= rect.right + threshold,
1079
1113
  insideVertically = y >= rect.top - threshold && y <= rect.bottom + threshold;
1080
1114
 
1081
- if (threshold && insideHorizontally && insideVertically) {
1115
+ if (insideHorizontally && insideVertically) {
1082
1116
  return ret = sortable;
1083
1117
  }
1084
1118
  });
@@ -1133,7 +1167,7 @@ _detectNearestEmptySortable = function _detectNearestEmptySortable(x, y) {
1133
1167
  }; // #1184 fix - Prevent click event on fallback if dragged but item not changed position
1134
1168
 
1135
1169
 
1136
- if (documentExists) {
1170
+ if (documentExists && !ChromeForAndroid) {
1137
1171
  document.addEventListener('click', function (evt) {
1138
1172
  if (ignoreNextClick) {
1139
1173
  evt.preventDefault();
@@ -1175,10 +1209,10 @@ var _checkOutsideTargetEl = function _checkOutsideTargetEl(evt) {
1175
1209
  dragEl.parentNode[expando]._isOutsideThisEl(evt.target);
1176
1210
  }
1177
1211
  };
1178
- /**
1179
- * @class Sortable
1180
- * @param {HTMLElement} el
1181
- * @param {Object} [options]
1212
+ /**
1213
+ * @class Sortable
1214
+ * @param {HTMLElement} el
1215
+ * @param {Object} [options]
1182
1216
  */
1183
1217
 
1184
1218
 
@@ -1752,6 +1786,7 @@ Sortable.prototype =
1752
1786
 
1753
1787
  if (!Sortable.eventCanceled) {
1754
1788
  cloneEl = clone(dragEl);
1789
+ cloneEl.removeAttribute("id");
1755
1790
  cloneEl.draggable = false;
1756
1791
  cloneEl.style['will-change'] = '';
1757
1792
 
@@ -1829,7 +1864,7 @@ Sortable.prototype =
1829
1864
  if (_silent) return;
1830
1865
 
1831
1866
  function dragOverEvent(name, extra) {
1832
- pluginEvent(name, _this, _objectSpread({
1867
+ pluginEvent(name, _this, _objectSpread2({
1833
1868
  evt: evt,
1834
1869
  isOwner: isOwner,
1835
1870
  axis: vertical ? 'vertical' : 'horizontal',
@@ -1946,7 +1981,7 @@ Sortable.prototype =
1946
1981
 
1947
1982
  ignoreNextClick = false;
1948
1983
 
1949
- if (activeSortable && !options.disabled && (isOwner ? canSort || (revert = !rootEl.contains(dragEl)) // Reverting item into the original list
1984
+ if (activeSortable && !options.disabled && (isOwner ? canSort || (revert = parentEl !== rootEl) // Reverting item into the original list
1950
1985
  : putSortable === this || (this.lastPutMode = activeGroup.checkPull(this, activeSortable, dragEl, evt)) && group.checkPut(this, activeSortable, dragEl, evt))) {
1951
1986
  vertical = this._getDirection(evt, target) === 'vertical';
1952
1987
  dragRect = getRect(dragEl);
@@ -1976,10 +2011,11 @@ Sortable.prototype =
1976
2011
  var elLastChild = lastChild(el, options.draggable);
1977
2012
 
1978
2013
  if (!elLastChild || _ghostIsLast(evt, vertical, this) && !elLastChild.animated) {
2014
+ // Insert to end of list
1979
2015
  // If already at end of list: Do not insert
1980
2016
  if (elLastChild === dragEl) {
1981
2017
  return completed(false);
1982
- } // assign target only if condition is true
2018
+ } // if there is a last element, it is the target
1983
2019
 
1984
2020
 
1985
2021
  if (elLastChild && el === evt.target) {
@@ -1992,7 +2028,33 @@ Sortable.prototype =
1992
2028
 
1993
2029
  if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, !!target) !== false) {
1994
2030
  capture();
1995
- el.appendChild(dragEl);
2031
+
2032
+ if (elLastChild && elLastChild.nextSibling) {
2033
+ // the last draggable element is not the last node
2034
+ el.insertBefore(dragEl, elLastChild.nextSibling);
2035
+ } else {
2036
+ el.appendChild(dragEl);
2037
+ }
2038
+
2039
+ parentEl = el; // actualization
2040
+
2041
+ changed();
2042
+ return completed(true);
2043
+ }
2044
+ } else if (elLastChild && _ghostIsFirst(evt, vertical, this)) {
2045
+ // Insert to start of list
2046
+ var firstChild = getChild(el, 0, options, true);
2047
+
2048
+ if (firstChild === dragEl) {
2049
+ return completed(false);
2050
+ }
2051
+
2052
+ target = firstChild;
2053
+ targetRect = getRect(target);
2054
+
2055
+ if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, false) !== false) {
2056
+ capture();
2057
+ el.insertBefore(dragEl, firstChild);
1996
2058
  parentEl = el; // actualization
1997
2059
 
1998
2060
  changed();
@@ -2296,9 +2358,9 @@ Sortable.prototype =
2296
2358
  }
2297
2359
  },
2298
2360
 
2299
- /**
2300
- * Serializes the item into an array of string.
2301
- * @returns {String[]}
2361
+ /**
2362
+ * Serializes the item into an array of string.
2363
+ * @returns {String[]}
2302
2364
  */
2303
2365
  toArray: function toArray() {
2304
2366
  var order = [],
@@ -2319,9 +2381,9 @@ Sortable.prototype =
2319
2381
  return order;
2320
2382
  },
2321
2383
 
2322
- /**
2323
- * Sorts the elements according to the array.
2324
- * @param {String[]} order order of the items
2384
+ /**
2385
+ * Sorts the elements according to the array.
2386
+ * @param {String[]} order order of the items
2325
2387
  */
2326
2388
  sort: function sort(order, useAnimation) {
2327
2389
  var items = {},
@@ -2343,29 +2405,29 @@ Sortable.prototype =
2343
2405
  useAnimation && this.animateAll();
2344
2406
  },
2345
2407
 
2346
- /**
2347
- * Save the current sorting
2408
+ /**
2409
+ * Save the current sorting
2348
2410
  */
2349
2411
  save: function save() {
2350
2412
  var store = this.options.store;
2351
2413
  store && store.set && store.set(this);
2352
2414
  },
2353
2415
 
2354
- /**
2355
- * For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.
2356
- * @param {HTMLElement} el
2357
- * @param {String} [selector] default: `options.draggable`
2358
- * @returns {HTMLElement|null}
2416
+ /**
2417
+ * For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.
2418
+ * @param {HTMLElement} el
2419
+ * @param {String} [selector] default: `options.draggable`
2420
+ * @returns {HTMLElement|null}
2359
2421
  */
2360
2422
  closest: function closest$1(el, selector) {
2361
2423
  return closest(el, selector || this.options.draggable, this.el, false);
2362
2424
  },
2363
2425
 
2364
- /**
2365
- * Set/get option
2366
- * @param {string} name
2367
- * @param {*} [value]
2368
- * @returns {*}
2426
+ /**
2427
+ * Set/get option
2428
+ * @param {string} name
2429
+ * @param {*} [value]
2430
+ * @returns {*}
2369
2431
  */
2370
2432
  option: function option(name, value) {
2371
2433
  var options = this.options;
@@ -2387,8 +2449,8 @@ Sortable.prototype =
2387
2449
  }
2388
2450
  },
2389
2451
 
2390
- /**
2391
- * Destroy
2452
+ /**
2453
+ * Destroy
2392
2454
  */
2393
2455
  destroy: function destroy() {
2394
2456
  pluginEvent('destroy', this);
@@ -2508,6 +2570,12 @@ function _unsilent() {
2508
2570
  _silent = false;
2509
2571
  }
2510
2572
 
2573
+ function _ghostIsFirst(evt, vertical, sortable) {
2574
+ var rect = getRect(getChild(sortable.el, 0, sortable.options, true));
2575
+ var spacer = 10;
2576
+ return vertical ? evt.clientX < rect.left - spacer || evt.clientY < rect.top && evt.clientX < rect.right : evt.clientY < rect.top - spacer || evt.clientY < rect.bottom && evt.clientX < rect.left;
2577
+ }
2578
+
2511
2579
  function _ghostIsLast(evt, vertical, sortable) {
2512
2580
  var rect = getRect(lastChild(sortable.el, sortable.options.draggable));
2513
2581
  var spacer = 10;
@@ -2559,11 +2627,11 @@ function _getSwapDirection(evt, target, targetRect, vertical, swapThreshold, inv
2559
2627
 
2560
2628
  return 0;
2561
2629
  }
2562
- /**
2563
- * Gets the direction dragEl must be swapped relative to target in order to make it
2564
- * seem that dragEl has been "inserted" into that element's position
2565
- * @param {HTMLElement} target The target whose position dragEl is being inserted at
2566
- * @return {Number} Direction dragEl must be swapped
2630
+ /**
2631
+ * Gets the direction dragEl must be swapped relative to target in order to make it
2632
+ * seem that dragEl has been "inserted" into that element's position
2633
+ * @param {HTMLElement} target The target whose position dragEl is being inserted at
2634
+ * @return {Number} Direction dragEl must be swapped
2567
2635
  */
2568
2636
 
2569
2637
 
@@ -2574,11 +2642,11 @@ function _getInsertDirection(target) {
2574
2642
  return -1;
2575
2643
  }
2576
2644
  }
2577
- /**
2578
- * Generate id
2579
- * @param {HTMLElement} el
2580
- * @returns {String}
2581
- * @private
2645
+ /**
2646
+ * Generate id
2647
+ * @param {HTMLElement} el
2648
+ * @returns {String}
2649
+ * @private
2582
2650
  */
2583
2651
 
2584
2652
 
@@ -2642,18 +2710,18 @@ Sortable.utils = {
2642
2710
  detectDirection: _detectDirection,
2643
2711
  getChild: getChild
2644
2712
  };
2645
- /**
2646
- * Get the Sortable instance of an element
2647
- * @param {HTMLElement} element The element
2648
- * @return {Sortable|undefined} The instance of Sortable
2713
+ /**
2714
+ * Get the Sortable instance of an element
2715
+ * @param {HTMLElement} element The element
2716
+ * @return {Sortable|undefined} The instance of Sortable
2649
2717
  */
2650
2718
 
2651
2719
  Sortable.get = function (element) {
2652
2720
  return element[expando];
2653
2721
  };
2654
- /**
2655
- * Mount a plugin to Sortable
2656
- * @param {...SortablePlugin|SortablePlugin[]} plugins Plugins being mounted
2722
+ /**
2723
+ * Mount a plugin to Sortable
2724
+ * @param {...SortablePlugin|SortablePlugin[]} plugins Plugins being mounted
2657
2725
  */
2658
2726
 
2659
2727
 
@@ -2668,14 +2736,14 @@ Sortable.mount = function () {
2668
2736
  throw "Sortable: Mounted plugin must be a constructor function, not ".concat({}.toString.call(plugin));
2669
2737
  }
2670
2738
 
2671
- if (plugin.utils) Sortable.utils = _objectSpread({}, Sortable.utils, plugin.utils);
2739
+ if (plugin.utils) Sortable.utils = _objectSpread2(_objectSpread2({}, Sortable.utils), plugin.utils);
2672
2740
  PluginManager.mount(plugin);
2673
2741
  });
2674
2742
  };
2675
- /**
2676
- * Create sortable instance
2677
- * @param {HTMLElement} el
2678
- * @param {Object} [options]
2743
+ /**
2744
+ * Create sortable instance
2745
+ * @param {HTMLElement} el
2746
+ * @param {Object} [options]
2679
2747
  */
2680
2748
 
2681
2749
 
@@ -2699,6 +2767,7 @@ function AutoScrollPlugin() {
2699
2767
  function AutoScroll() {
2700
2768
  this.defaults = {
2701
2769
  scroll: true,
2770
+ forceAutoScrollFallback: false,
2702
2771
  scrollSensitivity: 30,
2703
2772
  scrollSpeed: 10,
2704
2773
  bubbleScroll: true
@@ -2766,7 +2835,7 @@ function AutoScrollPlugin() {
2766
2835
  // MACOS Safari does not have autoscroll,
2767
2836
  // Firefox and Chrome are good
2768
2837
 
2769
- if (fallback || Edge || IE11OrLess || Safari) {
2838
+ if (fallback || this.options.forceAutoScrollFallback || Edge || IE11OrLess || Safari) {
2770
2839
  autoScroll(evt, this.options, elem, fallback); // Listener for pointer element change
2771
2840
 
2772
2841
  var ogElemScroller = getParentAutoScrollElement(elem, true);
@@ -3113,11 +3182,13 @@ function MultiDragPlugin() {
3113
3182
  }
3114
3183
  }
3115
3184
 
3116
- if (sortable.options.supportPointer) {
3117
- on(document, 'pointerup', this._deselectMultiDrag);
3118
- } else {
3119
- on(document, 'mouseup', this._deselectMultiDrag);
3120
- on(document, 'touchend', this._deselectMultiDrag);
3185
+ if (!sortable.options.avoidImplicitDeselect) {
3186
+ if (sortable.options.supportPointer) {
3187
+ on(document, 'pointerup', this._deselectMultiDrag);
3188
+ } else {
3189
+ on(document, 'mouseup', this._deselectMultiDrag);
3190
+ on(document, 'touchend', this._deselectMultiDrag);
3191
+ }
3121
3192
  }
3122
3193
 
3123
3194
  on(document, 'keydown', this._checkKeyDown);
@@ -3125,6 +3196,7 @@ function MultiDragPlugin() {
3125
3196
  this.defaults = {
3126
3197
  selectedClass: 'sortable-selected',
3127
3198
  multiDragKey: null,
3199
+ avoidImplicitDeselect: false,
3128
3200
  setData: function setData(dataTransfer, dragEl) {
3129
3201
  var data = '';
3130
3202
 
@@ -3415,7 +3487,7 @@ function MultiDragPlugin() {
3415
3487
  rootEl: rootEl,
3416
3488
  name: 'select',
3417
3489
  targetEl: dragEl$1,
3418
- originalEvt: evt
3490
+ originalEvent: evt
3419
3491
  }); // Modifier activated, select from last to dragEl
3420
3492
 
3421
3493
  if (evt.shiftKey && lastMultiDragSelect && sortable.el.contains(lastMultiDragSelect)) {
@@ -3444,7 +3516,7 @@ function MultiDragPlugin() {
3444
3516
  rootEl: rootEl,
3445
3517
  name: 'select',
3446
3518
  targetEl: children[i],
3447
- originalEvt: evt
3519
+ originalEvent: evt
3448
3520
  });
3449
3521
  }
3450
3522
  }
@@ -3461,14 +3533,15 @@ function MultiDragPlugin() {
3461
3533
  rootEl: rootEl,
3462
3534
  name: 'deselect',
3463
3535
  targetEl: dragEl$1,
3464
- originalEvt: evt
3536
+ originalEvent: evt
3465
3537
  });
3466
3538
  }
3467
3539
  } // Multi-drag drop
3468
3540
 
3469
3541
 
3470
3542
  if (dragStarted && this.isMultiDrag) {
3471
- // Do not "unfold" after around dragEl if reverted
3543
+ folding = false; // Do not "unfold" after around dragEl if reverted
3544
+
3472
3545
  if ((parentEl[expando].options.sort || parentEl !== rootEl) && multiDragElements.length > 1) {
3473
3546
  var dragRect = getRect(dragEl$1),
3474
3547
  multiDragIndex = index(dragEl$1, ':not(.' + this.options.selectedClass + ')');
@@ -3571,7 +3644,7 @@ function MultiDragPlugin() {
3571
3644
  rootEl: this.sortable.el,
3572
3645
  name: 'deselect',
3573
3646
  targetEl: el,
3574
- originalEvt: evt
3647
+ originalEvent: evt
3575
3648
  });
3576
3649
  }
3577
3650
  },