govuk_publishing_components 30.2.0 → 30.4.0

Sign up to get free protection for your applications and to get access to all the features.
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,5 +1,5 @@
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
@@ -8,9 +8,49 @@
8
8
  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
9
9
  typeof define === 'function' && define.amd ? define(factory) :
10
10
  (global = global || self, global.Sortable = factory());
11
- }(this, function () { 'use strict';
11
+ }(this, (function () { 'use strict';
12
+
13
+ function ownKeys(object, enumerableOnly) {
14
+ var keys = Object.keys(object);
15
+
16
+ if (Object.getOwnPropertySymbols) {
17
+ var symbols = Object.getOwnPropertySymbols(object);
18
+
19
+ if (enumerableOnly) {
20
+ symbols = symbols.filter(function (sym) {
21
+ return Object.getOwnPropertyDescriptor(object, sym).enumerable;
22
+ });
23
+ }
24
+
25
+ keys.push.apply(keys, symbols);
26
+ }
27
+
28
+ return keys;
29
+ }
30
+
31
+ function _objectSpread2(target) {
32
+ for (var i = 1; i < arguments.length; i++) {
33
+ var source = arguments[i] != null ? arguments[i] : {};
34
+
35
+ if (i % 2) {
36
+ ownKeys(Object(source), true).forEach(function (key) {
37
+ _defineProperty(target, key, source[key]);
38
+ });
39
+ } else if (Object.getOwnPropertyDescriptors) {
40
+ Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
41
+ } else {
42
+ ownKeys(Object(source)).forEach(function (key) {
43
+ Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
44
+ });
45
+ }
46
+ }
47
+
48
+ return target;
49
+ }
12
50
 
13
51
  function _typeof(obj) {
52
+ "@babel/helpers - typeof";
53
+
14
54
  if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
15
55
  _typeof = function (obj) {
16
56
  return typeof obj;
@@ -57,25 +97,6 @@
57
97
  return _extends.apply(this, arguments);
58
98
  }
59
99
 
60
- function _objectSpread(target) {
61
- for (var i = 1; i < arguments.length; i++) {
62
- var source = arguments[i] != null ? arguments[i] : {};
63
- var ownKeys = Object.keys(source);
64
-
65
- if (typeof Object.getOwnPropertySymbols === 'function') {
66
- ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {
67
- return Object.getOwnPropertyDescriptor(source, sym).enumerable;
68
- }));
69
- }
70
-
71
- ownKeys.forEach(function (key) {
72
- _defineProperty(target, key, source[key]);
73
- });
74
- }
75
-
76
- return target;
77
- }
78
-
79
100
  function _objectWithoutPropertiesLoose(source, excluded) {
80
101
  if (source == null) return {};
81
102
  var target = {};
@@ -113,32 +134,43 @@
113
134
  }
114
135
 
115
136
  function _toConsumableArray(arr) {
116
- return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread();
137
+ return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();
117
138
  }
118
139
 
119
140
  function _arrayWithoutHoles(arr) {
120
- if (Array.isArray(arr)) {
121
- for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];
122
-
123
- return arr2;
124
- }
141
+ if (Array.isArray(arr)) return _arrayLikeToArray(arr);
125
142
  }
126
143
 
127
144
  function _iterableToArray(iter) {
128
- if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter);
145
+ if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
146
+ }
147
+
148
+ function _unsupportedIterableToArray(o, minLen) {
149
+ if (!o) return;
150
+ if (typeof o === "string") return _arrayLikeToArray(o, minLen);
151
+ var n = Object.prototype.toString.call(o).slice(8, -1);
152
+ if (n === "Object" && o.constructor) n = o.constructor.name;
153
+ if (n === "Map" || n === "Set") return Array.from(o);
154
+ if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
155
+ }
156
+
157
+ function _arrayLikeToArray(arr, len) {
158
+ if (len == null || len > arr.length) len = arr.length;
159
+
160
+ for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
161
+
162
+ return arr2;
129
163
  }
130
164
 
131
165
  function _nonIterableSpread() {
132
- throw new TypeError("Invalid attempt to spread non-iterable instance");
166
+ throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
133
167
  }
134
168
 
135
- var version = "1.13.0";
169
+ var version = "1.15.0";
136
170
 
137
171
  function userAgent(pattern) {
138
172
  if (typeof window !== 'undefined' && window.navigator) {
139
- return !!
140
- /*@__PURE__*/
141
- navigator.userAgent.match(pattern);
173
+ return !! /*@__PURE__*/navigator.userAgent.match(pattern);
142
174
  }
143
175
  }
144
176
 
@@ -419,13 +451,13 @@
419
451
  */
420
452
 
421
453
 
422
- function getChild(el, childNum, options) {
454
+ function getChild(el, childNum, options, includeDragEl) {
423
455
  var currentChild = 0,
424
456
  i = 0,
425
457
  children = el.children;
426
458
 
427
459
  while (i < children.length) {
428
- if (children[i].style.display !== 'none' && children[i] !== Sortable.ghost && children[i] !== Sortable.dragged && closest(children[i], options.draggable, el, false)) {
460
+ if (children[i].style.display !== 'none' && children[i] !== Sortable.ghost && (includeDragEl || children[i] !== Sortable.dragged) && closest(children[i], options.draggable, el, false)) {
429
461
  if (currentChild === childNum) {
430
462
  return children[i];
431
463
  }
@@ -643,7 +675,7 @@
643
675
  rect: getRect(child)
644
676
  });
645
677
 
646
- var fromRect = _objectSpread({}, animationStates[animationStates.length - 1].rect); // If animating: compensate for current animation
678
+ var fromRect = _objectSpread2({}, animationStates[animationStates.length - 1].rect); // If animating: compensate for current animation
647
679
 
648
680
 
649
681
  if (child.thisAnimationDuration) {
@@ -813,7 +845,7 @@
813
845
  if (!sortable[plugin.pluginName]) return; // Fire global events if it exists in this sortable
814
846
 
815
847
  if (sortable[plugin.pluginName][eventNameGlobal]) {
816
- sortable[plugin.pluginName][eventNameGlobal](_objectSpread({
848
+ sortable[plugin.pluginName][eventNameGlobal](_objectSpread2({
817
849
  sortable: sortable
818
850
  }, evt));
819
851
  } // Only fire plugin event if plugin is enabled in this sortable,
@@ -821,7 +853,7 @@
821
853
 
822
854
 
823
855
  if (sortable.options[plugin.pluginName] && sortable[plugin.pluginName][eventName]) {
824
- sortable[plugin.pluginName][eventName](_objectSpread({
856
+ sortable[plugin.pluginName][eventName](_objectSpread2({
825
857
  sortable: sortable
826
858
  }, evt));
827
859
  }
@@ -913,7 +945,7 @@
913
945
  evt.originalEvent = originalEvent;
914
946
  evt.pullMode = putSortable ? putSortable.lastPutMode : undefined;
915
947
 
916
- var allEventProperties = _objectSpread({}, extraEventProperties, PluginManager.getEventProperties(name, sortable));
948
+ var allEventProperties = _objectSpread2(_objectSpread2({}, extraEventProperties), PluginManager.getEventProperties(name, sortable));
917
949
 
918
950
  for (var option in allEventProperties) {
919
951
  evt[option] = allEventProperties[option];
@@ -928,12 +960,14 @@
928
960
  }
929
961
  }
930
962
 
963
+ var _excluded = ["evt"];
964
+
931
965
  var pluginEvent = function pluginEvent(eventName, sortable) {
932
966
  var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
933
967
  originalEvent = _ref.evt,
934
- data = _objectWithoutProperties(_ref, ["evt"]);
968
+ data = _objectWithoutProperties(_ref, _excluded);
935
969
 
936
- PluginManager.pluginEvent.bind(Sortable)(eventName, sortable, _objectSpread({
970
+ PluginManager.pluginEvent.bind(Sortable)(eventName, sortable, _objectSpread2({
937
971
  dragEl: dragEl,
938
972
  parentEl: parentEl,
939
973
  ghostEl: ghostEl,
@@ -969,7 +1003,7 @@
969
1003
  };
970
1004
 
971
1005
  function _dispatchEvent(info) {
972
- dispatchEvent(_objectSpread({
1006
+ dispatchEvent(_objectSpread2({
973
1007
  putSortable: putSortable,
974
1008
  cloneEl: cloneEl,
975
1009
  targetEl: dragEl,
@@ -1069,22 +1103,22 @@
1069
1103
  return dragElS1Opp === targetS1Opp || dragElS2Opp === targetS2Opp || dragElS1Opp + dragElOppLength / 2 === targetS1Opp + targetOppLength / 2;
1070
1104
  },
1071
1105
 
1072
- /**
1073
- * Detects first nearest empty sortable to X and Y position using emptyInsertThreshold.
1074
- * @param {Number} x X position
1075
- * @param {Number} y Y position
1076
- * @return {HTMLElement} Element of the first found nearest Sortable
1106
+ /**
1107
+ * Detects first nearest empty sortable to X and Y position using emptyInsertThreshold.
1108
+ * @param {Number} x X position
1109
+ * @param {Number} y Y position
1110
+ * @return {HTMLElement} Element of the first found nearest Sortable
1077
1111
  */
1078
1112
  _detectNearestEmptySortable = function _detectNearestEmptySortable(x, y) {
1079
1113
  var ret;
1080
1114
  sortables.some(function (sortable) {
1081
- if (lastChild(sortable)) return;
1115
+ var threshold = sortable[expando].options.emptyInsertThreshold;
1116
+ if (!threshold || lastChild(sortable)) return;
1082
1117
  var rect = getRect(sortable),
1083
- threshold = sortable[expando].options.emptyInsertThreshold,
1084
1118
  insideHorizontally = x >= rect.left - threshold && x <= rect.right + threshold,
1085
1119
  insideVertically = y >= rect.top - threshold && y <= rect.bottom + threshold;
1086
1120
 
1087
- if (threshold && insideHorizontally && insideVertically) {
1121
+ if (insideHorizontally && insideVertically) {
1088
1122
  return ret = sortable;
1089
1123
  }
1090
1124
  });
@@ -1139,7 +1173,7 @@
1139
1173
  }; // #1184 fix - Prevent click event on fallback if dragged but item not changed position
1140
1174
 
1141
1175
 
1142
- if (documentExists) {
1176
+ if (documentExists && !ChromeForAndroid) {
1143
1177
  document.addEventListener('click', function (evt) {
1144
1178
  if (ignoreNextClick) {
1145
1179
  evt.preventDefault();
@@ -1181,10 +1215,10 @@
1181
1215
  dragEl.parentNode[expando]._isOutsideThisEl(evt.target);
1182
1216
  }
1183
1217
  };
1184
- /**
1185
- * @class Sortable
1186
- * @param {HTMLElement} el
1187
- * @param {Object} [options]
1218
+ /**
1219
+ * @class Sortable
1220
+ * @param {HTMLElement} el
1221
+ * @param {Object} [options]
1188
1222
  */
1189
1223
 
1190
1224
 
@@ -1758,6 +1792,7 @@
1758
1792
 
1759
1793
  if (!Sortable.eventCanceled) {
1760
1794
  cloneEl = clone(dragEl);
1795
+ cloneEl.removeAttribute("id");
1761
1796
  cloneEl.draggable = false;
1762
1797
  cloneEl.style['will-change'] = '';
1763
1798
 
@@ -1835,7 +1870,7 @@
1835
1870
  if (_silent) return;
1836
1871
 
1837
1872
  function dragOverEvent(name, extra) {
1838
- pluginEvent(name, _this, _objectSpread({
1873
+ pluginEvent(name, _this, _objectSpread2({
1839
1874
  evt: evt,
1840
1875
  isOwner: isOwner,
1841
1876
  axis: vertical ? 'vertical' : 'horizontal',
@@ -1952,7 +1987,7 @@
1952
1987
 
1953
1988
  ignoreNextClick = false;
1954
1989
 
1955
- if (activeSortable && !options.disabled && (isOwner ? canSort || (revert = !rootEl.contains(dragEl)) // Reverting item into the original list
1990
+ if (activeSortable && !options.disabled && (isOwner ? canSort || (revert = parentEl !== rootEl) // Reverting item into the original list
1956
1991
  : putSortable === this || (this.lastPutMode = activeGroup.checkPull(this, activeSortable, dragEl, evt)) && group.checkPut(this, activeSortable, dragEl, evt))) {
1957
1992
  vertical = this._getDirection(evt, target) === 'vertical';
1958
1993
  dragRect = getRect(dragEl);
@@ -1982,10 +2017,11 @@
1982
2017
  var elLastChild = lastChild(el, options.draggable);
1983
2018
 
1984
2019
  if (!elLastChild || _ghostIsLast(evt, vertical, this) && !elLastChild.animated) {
2020
+ // Insert to end of list
1985
2021
  // If already at end of list: Do not insert
1986
2022
  if (elLastChild === dragEl) {
1987
2023
  return completed(false);
1988
- } // assign target only if condition is true
2024
+ } // if there is a last element, it is the target
1989
2025
 
1990
2026
 
1991
2027
  if (elLastChild && el === evt.target) {
@@ -1998,7 +2034,33 @@
1998
2034
 
1999
2035
  if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, !!target) !== false) {
2000
2036
  capture();
2001
- el.appendChild(dragEl);
2037
+
2038
+ if (elLastChild && elLastChild.nextSibling) {
2039
+ // the last draggable element is not the last node
2040
+ el.insertBefore(dragEl, elLastChild.nextSibling);
2041
+ } else {
2042
+ el.appendChild(dragEl);
2043
+ }
2044
+
2045
+ parentEl = el; // actualization
2046
+
2047
+ changed();
2048
+ return completed(true);
2049
+ }
2050
+ } else if (elLastChild && _ghostIsFirst(evt, vertical, this)) {
2051
+ // Insert to start of list
2052
+ var firstChild = getChild(el, 0, options, true);
2053
+
2054
+ if (firstChild === dragEl) {
2055
+ return completed(false);
2056
+ }
2057
+
2058
+ target = firstChild;
2059
+ targetRect = getRect(target);
2060
+
2061
+ if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, false) !== false) {
2062
+ capture();
2063
+ el.insertBefore(dragEl, firstChild);
2002
2064
  parentEl = el; // actualization
2003
2065
 
2004
2066
  changed();
@@ -2302,9 +2364,9 @@
2302
2364
  }
2303
2365
  },
2304
2366
 
2305
- /**
2306
- * Serializes the item into an array of string.
2307
- * @returns {String[]}
2367
+ /**
2368
+ * Serializes the item into an array of string.
2369
+ * @returns {String[]}
2308
2370
  */
2309
2371
  toArray: function toArray() {
2310
2372
  var order = [],
@@ -2325,9 +2387,9 @@
2325
2387
  return order;
2326
2388
  },
2327
2389
 
2328
- /**
2329
- * Sorts the elements according to the array.
2330
- * @param {String[]} order order of the items
2390
+ /**
2391
+ * Sorts the elements according to the array.
2392
+ * @param {String[]} order order of the items
2331
2393
  */
2332
2394
  sort: function sort(order, useAnimation) {
2333
2395
  var items = {},
@@ -2349,29 +2411,29 @@
2349
2411
  useAnimation && this.animateAll();
2350
2412
  },
2351
2413
 
2352
- /**
2353
- * Save the current sorting
2414
+ /**
2415
+ * Save the current sorting
2354
2416
  */
2355
2417
  save: function save() {
2356
2418
  var store = this.options.store;
2357
2419
  store && store.set && store.set(this);
2358
2420
  },
2359
2421
 
2360
- /**
2361
- * 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.
2362
- * @param {HTMLElement} el
2363
- * @param {String} [selector] default: `options.draggable`
2364
- * @returns {HTMLElement|null}
2422
+ /**
2423
+ * 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.
2424
+ * @param {HTMLElement} el
2425
+ * @param {String} [selector] default: `options.draggable`
2426
+ * @returns {HTMLElement|null}
2365
2427
  */
2366
2428
  closest: function closest$1(el, selector) {
2367
2429
  return closest(el, selector || this.options.draggable, this.el, false);
2368
2430
  },
2369
2431
 
2370
- /**
2371
- * Set/get option
2372
- * @param {string} name
2373
- * @param {*} [value]
2374
- * @returns {*}
2432
+ /**
2433
+ * Set/get option
2434
+ * @param {string} name
2435
+ * @param {*} [value]
2436
+ * @returns {*}
2375
2437
  */
2376
2438
  option: function option(name, value) {
2377
2439
  var options = this.options;
@@ -2393,8 +2455,8 @@
2393
2455
  }
2394
2456
  },
2395
2457
 
2396
- /**
2397
- * Destroy
2458
+ /**
2459
+ * Destroy
2398
2460
  */
2399
2461
  destroy: function destroy() {
2400
2462
  pluginEvent('destroy', this);
@@ -2514,6 +2576,12 @@
2514
2576
  _silent = false;
2515
2577
  }
2516
2578
 
2579
+ function _ghostIsFirst(evt, vertical, sortable) {
2580
+ var rect = getRect(getChild(sortable.el, 0, sortable.options, true));
2581
+ var spacer = 10;
2582
+ 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;
2583
+ }
2584
+
2517
2585
  function _ghostIsLast(evt, vertical, sortable) {
2518
2586
  var rect = getRect(lastChild(sortable.el, sortable.options.draggable));
2519
2587
  var spacer = 10;
@@ -2565,11 +2633,11 @@
2565
2633
 
2566
2634
  return 0;
2567
2635
  }
2568
- /**
2569
- * Gets the direction dragEl must be swapped relative to target in order to make it
2570
- * seem that dragEl has been "inserted" into that element's position
2571
- * @param {HTMLElement} target The target whose position dragEl is being inserted at
2572
- * @return {Number} Direction dragEl must be swapped
2636
+ /**
2637
+ * Gets the direction dragEl must be swapped relative to target in order to make it
2638
+ * seem that dragEl has been "inserted" into that element's position
2639
+ * @param {HTMLElement} target The target whose position dragEl is being inserted at
2640
+ * @return {Number} Direction dragEl must be swapped
2573
2641
  */
2574
2642
 
2575
2643
 
@@ -2580,11 +2648,11 @@
2580
2648
  return -1;
2581
2649
  }
2582
2650
  }
2583
- /**
2584
- * Generate id
2585
- * @param {HTMLElement} el
2586
- * @returns {String}
2587
- * @private
2651
+ /**
2652
+ * Generate id
2653
+ * @param {HTMLElement} el
2654
+ * @returns {String}
2655
+ * @private
2588
2656
  */
2589
2657
 
2590
2658
 
@@ -2648,18 +2716,18 @@
2648
2716
  detectDirection: _detectDirection,
2649
2717
  getChild: getChild
2650
2718
  };
2651
- /**
2652
- * Get the Sortable instance of an element
2653
- * @param {HTMLElement} element The element
2654
- * @return {Sortable|undefined} The instance of Sortable
2719
+ /**
2720
+ * Get the Sortable instance of an element
2721
+ * @param {HTMLElement} element The element
2722
+ * @return {Sortable|undefined} The instance of Sortable
2655
2723
  */
2656
2724
 
2657
2725
  Sortable.get = function (element) {
2658
2726
  return element[expando];
2659
2727
  };
2660
- /**
2661
- * Mount a plugin to Sortable
2662
- * @param {...SortablePlugin|SortablePlugin[]} plugins Plugins being mounted
2728
+ /**
2729
+ * Mount a plugin to Sortable
2730
+ * @param {...SortablePlugin|SortablePlugin[]} plugins Plugins being mounted
2663
2731
  */
2664
2732
 
2665
2733
 
@@ -2674,14 +2742,14 @@
2674
2742
  throw "Sortable: Mounted plugin must be a constructor function, not ".concat({}.toString.call(plugin));
2675
2743
  }
2676
2744
 
2677
- if (plugin.utils) Sortable.utils = _objectSpread({}, Sortable.utils, plugin.utils);
2745
+ if (plugin.utils) Sortable.utils = _objectSpread2(_objectSpread2({}, Sortable.utils), plugin.utils);
2678
2746
  PluginManager.mount(plugin);
2679
2747
  });
2680
2748
  };
2681
- /**
2682
- * Create sortable instance
2683
- * @param {HTMLElement} el
2684
- * @param {Object} [options]
2749
+ /**
2750
+ * Create sortable instance
2751
+ * @param {HTMLElement} el
2752
+ * @param {Object} [options]
2685
2753
  */
2686
2754
 
2687
2755
 
@@ -2705,6 +2773,7 @@
2705
2773
  function AutoScroll() {
2706
2774
  this.defaults = {
2707
2775
  scroll: true,
2776
+ forceAutoScrollFallback: false,
2708
2777
  scrollSensitivity: 30,
2709
2778
  scrollSpeed: 10,
2710
2779
  bubbleScroll: true
@@ -2772,7 +2841,7 @@
2772
2841
  // MACOS Safari does not have autoscroll,
2773
2842
  // Firefox and Chrome are good
2774
2843
 
2775
- if (fallback || Edge || IE11OrLess || Safari) {
2844
+ if (fallback || this.options.forceAutoScrollFallback || Edge || IE11OrLess || Safari) {
2776
2845
  autoScroll(evt, this.options, elem, fallback); // Listener for pointer element change
2777
2846
 
2778
2847
  var ogElemScroller = getParentAutoScrollElement(elem, true);
@@ -3117,11 +3186,13 @@
3117
3186
  }
3118
3187
  }
3119
3188
 
3120
- if (sortable.options.supportPointer) {
3121
- on(document, 'pointerup', this._deselectMultiDrag);
3122
- } else {
3123
- on(document, 'mouseup', this._deselectMultiDrag);
3124
- on(document, 'touchend', this._deselectMultiDrag);
3189
+ if (!sortable.options.avoidImplicitDeselect) {
3190
+ if (sortable.options.supportPointer) {
3191
+ on(document, 'pointerup', this._deselectMultiDrag);
3192
+ } else {
3193
+ on(document, 'mouseup', this._deselectMultiDrag);
3194
+ on(document, 'touchend', this._deselectMultiDrag);
3195
+ }
3125
3196
  }
3126
3197
 
3127
3198
  on(document, 'keydown', this._checkKeyDown);
@@ -3129,6 +3200,7 @@
3129
3200
  this.defaults = {
3130
3201
  selectedClass: 'sortable-selected',
3131
3202
  multiDragKey: null,
3203
+ avoidImplicitDeselect: false,
3132
3204
  setData: function setData(dataTransfer, dragEl) {
3133
3205
  var data = '';
3134
3206
 
@@ -3419,7 +3491,7 @@
3419
3491
  rootEl: rootEl,
3420
3492
  name: 'select',
3421
3493
  targetEl: dragEl$1,
3422
- originalEvt: evt
3494
+ originalEvent: evt
3423
3495
  }); // Modifier activated, select from last to dragEl
3424
3496
 
3425
3497
  if (evt.shiftKey && lastMultiDragSelect && sortable.el.contains(lastMultiDragSelect)) {
@@ -3448,7 +3520,7 @@
3448
3520
  rootEl: rootEl,
3449
3521
  name: 'select',
3450
3522
  targetEl: children[i],
3451
- originalEvt: evt
3523
+ originalEvent: evt
3452
3524
  });
3453
3525
  }
3454
3526
  }
@@ -3465,14 +3537,15 @@
3465
3537
  rootEl: rootEl,
3466
3538
  name: 'deselect',
3467
3539
  targetEl: dragEl$1,
3468
- originalEvt: evt
3540
+ originalEvent: evt
3469
3541
  });
3470
3542
  }
3471
3543
  } // Multi-drag drop
3472
3544
 
3473
3545
 
3474
3546
  if (dragStarted && this.isMultiDrag) {
3475
- // Do not "unfold" after around dragEl if reverted
3547
+ folding = false; // Do not "unfold" after around dragEl if reverted
3548
+
3476
3549
  if ((parentEl[expando].options.sort || parentEl !== rootEl) && multiDragElements.length > 1) {
3477
3550
  var dragRect = getRect(dragEl$1),
3478
3551
  multiDragIndex = index(dragEl$1, ':not(.' + this.options.selectedClass + ')');
@@ -3575,7 +3648,7 @@
3575
3648
  rootEl: this.sortable.el,
3576
3649
  name: 'deselect',
3577
3650
  targetEl: el,
3578
- originalEvt: evt
3651
+ originalEvent: evt
3579
3652
  });
3580
3653
  }
3581
3654
  },
@@ -3718,4 +3791,4 @@
3718
3791
 
3719
3792
  return Sortable;
3720
3793
 
3721
- }));
3794
+ })));