@atlaskit/pragmatic-drag-and-drop 0.17.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 (155) hide show
  1. package/CHANGELOG.md +209 -0
  2. package/LICENSE.md +13 -0
  3. package/README.md +43 -0
  4. package/__perf__/add-example.todo +1 -0
  5. package/adapter/element/package.json +15 -0
  6. package/adapter/file/package.json +15 -0
  7. package/addon/cancel-unhandled/package.json +15 -0
  8. package/constellation/index/about.mdx +329 -0
  9. package/constellation/index/props.mdx +3 -0
  10. package/dist/cjs/adapter/element-adapter.js +151 -0
  11. package/dist/cjs/adapter/file-adapter.js +98 -0
  12. package/dist/cjs/addon/cancel-unhandled.js +50 -0
  13. package/dist/cjs/entry-point/adapter/element.js +24 -0
  14. package/dist/cjs/entry-point/adapter/file.js +18 -0
  15. package/dist/cjs/entry-point/addon/cancel-unhandled.js +12 -0
  16. package/dist/cjs/entry-point/experimental/cross-with-element-adapter.js +30 -0
  17. package/dist/cjs/entry-point/types.js +5 -0
  18. package/dist/cjs/entry-point/util/combine.js +12 -0
  19. package/dist/cjs/entry-point/util/disable-native-drag-preview.js +12 -0
  20. package/dist/cjs/entry-point/util/once.js +12 -0
  21. package/dist/cjs/entry-point/util/reorder.js +12 -0
  22. package/dist/cjs/entry-point/util/scroll-just-enough-into-view.js +12 -0
  23. package/dist/cjs/entry-point/util/set-custom-native-drag-preview.js +12 -0
  24. package/dist/cjs/experimental/cross-window-element-adapter.js +131 -0
  25. package/dist/cjs/index.js +12 -0
  26. package/dist/cjs/internal-types.js +5 -0
  27. package/dist/cjs/ledger/dispatch-consumer-event.js +132 -0
  28. package/dist/cjs/ledger/lifecycle-manager.js +335 -0
  29. package/dist/cjs/ledger/usage-ledger.js +37 -0
  30. package/dist/cjs/make-adapter/make-adapter.js +59 -0
  31. package/dist/cjs/make-adapter/make-drop-target.js +271 -0
  32. package/dist/cjs/make-adapter/make-monitor.js +100 -0
  33. package/dist/cjs/util/add-attribute.js +14 -0
  34. package/dist/cjs/util/combine.js +17 -0
  35. package/dist/cjs/util/disable-native-drag-preview.js +36 -0
  36. package/dist/cjs/util/entering-and-leaving-the-window.js +162 -0
  37. package/dist/cjs/util/fix-post-drag-pointer-bug.js +114 -0
  38. package/dist/cjs/util/get-input.js +20 -0
  39. package/dist/cjs/util/once.js +22 -0
  40. package/dist/cjs/util/reorder.js +26 -0
  41. package/dist/cjs/util/scroll-just-enough-into-view.js +17 -0
  42. package/dist/cjs/util/set-custom-native-drag-preview.js +109 -0
  43. package/dist/cjs/version.json +5 -0
  44. package/dist/es2019/adapter/element-adapter.js +143 -0
  45. package/dist/es2019/adapter/file-adapter.js +90 -0
  46. package/dist/es2019/addon/cancel-unhandled.js +43 -0
  47. package/dist/es2019/entry-point/adapter/element.js +1 -0
  48. package/dist/es2019/entry-point/adapter/file.js +1 -0
  49. package/dist/es2019/entry-point/addon/cancel-unhandled.js +1 -0
  50. package/dist/es2019/entry-point/experimental/cross-with-element-adapter.js +1 -0
  51. package/dist/es2019/entry-point/types.js +1 -0
  52. package/dist/es2019/entry-point/util/combine.js +1 -0
  53. package/dist/es2019/entry-point/util/disable-native-drag-preview.js +1 -0
  54. package/dist/es2019/entry-point/util/once.js +1 -0
  55. package/dist/es2019/entry-point/util/reorder.js +1 -0
  56. package/dist/es2019/entry-point/util/scroll-just-enough-into-view.js +1 -0
  57. package/dist/es2019/entry-point/util/set-custom-native-drag-preview.js +1 -0
  58. package/dist/es2019/experimental/cross-window-element-adapter.js +121 -0
  59. package/dist/es2019/index.js +7 -0
  60. package/dist/es2019/internal-types.js +1 -0
  61. package/dist/es2019/ledger/dispatch-consumer-event.js +128 -0
  62. package/dist/es2019/ledger/lifecycle-manager.js +333 -0
  63. package/dist/es2019/ledger/usage-ledger.js +32 -0
  64. package/dist/es2019/make-adapter/make-adapter.js +55 -0
  65. package/dist/es2019/make-adapter/make-drop-target.js +233 -0
  66. package/dist/es2019/make-adapter/make-monitor.js +80 -0
  67. package/dist/es2019/util/add-attribute.js +7 -0
  68. package/dist/es2019/util/combine.js +6 -0
  69. package/dist/es2019/util/disable-native-drag-preview.js +31 -0
  70. package/dist/es2019/util/entering-and-leaving-the-window.js +159 -0
  71. package/dist/es2019/util/fix-post-drag-pointer-bug.js +110 -0
  72. package/dist/es2019/util/get-input.js +14 -0
  73. package/dist/es2019/util/once.js +13 -0
  74. package/dist/es2019/util/reorder.js +17 -0
  75. package/dist/es2019/util/scroll-just-enough-into-view.js +12 -0
  76. package/dist/es2019/util/set-custom-native-drag-preview.js +106 -0
  77. package/dist/es2019/version.json +5 -0
  78. package/dist/esm/adapter/element-adapter.js +142 -0
  79. package/dist/esm/adapter/file-adapter.js +90 -0
  80. package/dist/esm/addon/cancel-unhandled.js +43 -0
  81. package/dist/esm/entry-point/adapter/element.js +1 -0
  82. package/dist/esm/entry-point/adapter/file.js +1 -0
  83. package/dist/esm/entry-point/addon/cancel-unhandled.js +1 -0
  84. package/dist/esm/entry-point/experimental/cross-with-element-adapter.js +1 -0
  85. package/dist/esm/entry-point/types.js +1 -0
  86. package/dist/esm/entry-point/util/combine.js +1 -0
  87. package/dist/esm/entry-point/util/disable-native-drag-preview.js +1 -0
  88. package/dist/esm/entry-point/util/once.js +1 -0
  89. package/dist/esm/entry-point/util/reorder.js +1 -0
  90. package/dist/esm/entry-point/util/scroll-just-enough-into-view.js +1 -0
  91. package/dist/esm/entry-point/util/set-custom-native-drag-preview.js +1 -0
  92. package/dist/esm/experimental/cross-window-element-adapter.js +120 -0
  93. package/dist/esm/index.js +7 -0
  94. package/dist/esm/internal-types.js +1 -0
  95. package/dist/esm/ledger/dispatch-consumer-event.js +125 -0
  96. package/dist/esm/ledger/lifecycle-manager.js +328 -0
  97. package/dist/esm/ledger/usage-ledger.js +31 -0
  98. package/dist/esm/make-adapter/make-adapter.js +53 -0
  99. package/dist/esm/make-adapter/make-drop-target.js +264 -0
  100. package/dist/esm/make-adapter/make-monitor.js +93 -0
  101. package/dist/esm/util/add-attribute.js +8 -0
  102. package/dist/esm/util/combine.js +11 -0
  103. package/dist/esm/util/disable-native-drag-preview.js +30 -0
  104. package/dist/esm/util/entering-and-leaving-the-window.js +156 -0
  105. package/dist/esm/util/fix-post-drag-pointer-bug.js +108 -0
  106. package/dist/esm/util/get-input.js +14 -0
  107. package/dist/esm/util/once.js +16 -0
  108. package/dist/esm/util/reorder.js +19 -0
  109. package/dist/esm/util/scroll-just-enough-into-view.js +11 -0
  110. package/dist/esm/util/set-custom-native-drag-preview.js +104 -0
  111. package/dist/esm/version.json +5 -0
  112. package/dist/types/adapter/element-adapter.d.ts +42 -0
  113. package/dist/types/adapter/file-adapter.d.ts +18 -0
  114. package/dist/types/addon/cancel-unhandled.d.ts +7 -0
  115. package/dist/types/entry-point/adapter/element.d.ts +2 -0
  116. package/dist/types/entry-point/adapter/file.d.ts +2 -0
  117. package/dist/types/entry-point/addon/cancel-unhandled.d.ts +1 -0
  118. package/dist/types/entry-point/experimental/cross-with-element-adapter.d.ts +1 -0
  119. package/dist/types/entry-point/types.d.ts +1 -0
  120. package/dist/types/entry-point/util/combine.d.ts +1 -0
  121. package/dist/types/entry-point/util/disable-native-drag-preview.d.ts +1 -0
  122. package/dist/types/entry-point/util/once.d.ts +1 -0
  123. package/dist/types/entry-point/util/reorder.d.ts +1 -0
  124. package/dist/types/entry-point/util/scroll-just-enough-into-view.d.ts +1 -0
  125. package/dist/types/entry-point/util/set-custom-native-drag-preview.d.ts +1 -0
  126. package/dist/types/experimental/cross-window-element-adapter.d.ts +17 -0
  127. package/dist/types/index.d.ts +2 -0
  128. package/dist/types/internal-types.d.ts +275 -0
  129. package/dist/types/ledger/dispatch-consumer-event.d.ts +26 -0
  130. package/dist/types/ledger/lifecycle-manager.d.ts +16 -0
  131. package/dist/types/ledger/usage-ledger.d.ts +5 -0
  132. package/dist/types/make-adapter/make-adapter.d.ts +14 -0
  133. package/dist/types/make-adapter/make-drop-target.d.ts +5 -0
  134. package/dist/types/make-adapter/make-monitor.d.ts +8 -0
  135. package/dist/types/util/add-attribute.d.ts +5 -0
  136. package/dist/types/util/combine.d.ts +3 -0
  137. package/dist/types/util/disable-native-drag-preview.d.ts +3 -0
  138. package/dist/types/util/entering-and-leaving-the-window.d.ts +6 -0
  139. package/dist/types/util/fix-post-drag-pointer-bug.d.ts +14 -0
  140. package/dist/types/util/get-input.d.ts +2 -0
  141. package/dist/types/util/once.d.ts +2 -0
  142. package/dist/types/util/reorder.d.ts +9 -0
  143. package/dist/types/util/scroll-just-enough-into-view.d.ts +7 -0
  144. package/dist/types/util/set-custom-native-drag-preview.d.ts +52 -0
  145. package/experimental/cross-window-element-adapter/package.json +15 -0
  146. package/package.json +87 -0
  147. package/report.api.md +35 -0
  148. package/tmp/api-report-tmp.d.ts +13 -0
  149. package/types/package.json +15 -0
  150. package/util/combine/package.json +15 -0
  151. package/util/disable-native-drag-preview/package.json +15 -0
  152. package/util/once/package.json +15 -0
  153. package/util/reorder/package.json +15 -0
  154. package/util/scroll-just-enough-into-view/package.json +15 -0
  155. package/util/set-custom-native-drag-preview/package.json +15 -0
@@ -0,0 +1,271 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.makeDropTarget = makeDropTarget;
8
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
9
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
10
+ var _addAttribute = require("../util/add-attribute");
11
+ var _combine = require("../util/combine");
12
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
13
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
14
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
15
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
16
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
17
+ function copyReverse(array) {
18
+ return array.slice(0).reverse();
19
+ }
20
+ function makeDropTarget(_ref) {
21
+ var typeKey = _ref.typeKey,
22
+ defaultDropEffect = _ref.defaultDropEffect;
23
+ var registry = new WeakMap();
24
+ var dropTargetDataAtt = "data-drop-target-for-".concat(typeKey);
25
+ var dropTargetSelector = "[".concat(dropTargetDataAtt, "]");
26
+ function addToRegistry(args) {
27
+ registry.set(args.element, args);
28
+ return function () {
29
+ return registry.delete(args.element);
30
+ };
31
+ }
32
+ function dropTargetForConsumers(args) {
33
+ // Guardrail: warn if the draggable element is already registered
34
+ if (process.env.NODE_ENV !== 'production') {
35
+ var existing = registry.get(args.element);
36
+ if (existing) {
37
+ // eslint-disable-next-line no-console
38
+ console.warn('You have already registered a `droppable` on the same element', {
39
+ existing: existing,
40
+ proposed: args
41
+ });
42
+ }
43
+ }
44
+ return (0, _combine.combine)((0, _addAttribute.addAttribute)(args.element, {
45
+ attribute: dropTargetDataAtt,
46
+ value: 'true'
47
+ }), addToRegistry(args));
48
+ }
49
+ function getActualDropTargets(_ref2) {
50
+ var _args$getData, _args$getData2, _args$getDropEffect, _args$getDropEffect2, _args$getIsSticky;
51
+ var source = _ref2.source,
52
+ target = _ref2.target,
53
+ input = _ref2.input,
54
+ _ref2$result = _ref2.result,
55
+ result = _ref2$result === void 0 ? [] : _ref2$result;
56
+ if (!(target instanceof Element)) {
57
+ return result;
58
+ }
59
+ var closest = target.closest(dropTargetSelector);
60
+
61
+ // Cannot find anything else
62
+ if (closest == null) {
63
+ return result;
64
+ }
65
+ var args = registry.get(closest);
66
+
67
+ // error: something had a dropTargetSelector but we could not
68
+ // find a match. For now, failing silently
69
+ if (args == null) {
70
+ return result;
71
+ }
72
+ var feedback = {
73
+ input: input,
74
+ source: source,
75
+ element: args.element
76
+ };
77
+
78
+ // if dropping is not allowed, skip this drop target
79
+ // and continue looking up the DOM tree
80
+ if (args.canDrop && !args.canDrop(feedback)) {
81
+ return getActualDropTargets({
82
+ source: source,
83
+ target: args.element.parentElement,
84
+ input: input,
85
+ result: result
86
+ });
87
+ }
88
+ var data = (_args$getData = (_args$getData2 = args.getData) === null || _args$getData2 === void 0 ? void 0 : _args$getData2.call(args, feedback)) !== null && _args$getData !== void 0 ? _args$getData : {};
89
+ var dropEffect = (_args$getDropEffect = (_args$getDropEffect2 = args.getDropEffect) === null || _args$getDropEffect2 === void 0 ? void 0 : _args$getDropEffect2.call(args, feedback)) !== null && _args$getDropEffect !== void 0 ? _args$getDropEffect : defaultDropEffect;
90
+ var sticky = Boolean((_args$getIsSticky = args.getIsSticky) === null || _args$getIsSticky === void 0 ? void 0 : _args$getIsSticky.call(args, feedback));
91
+ var record = {
92
+ data: data,
93
+ element: args.element,
94
+ dropEffect: dropEffect,
95
+ sticky: sticky
96
+ };
97
+ return getActualDropTargets({
98
+ source: source,
99
+ target: args.element.parentElement,
100
+ input: input,
101
+ // Using bubble ordering. Same ordering as `event.getPath()`
102
+ result: [].concat((0, _toConsumableArray2.default)(result), [record])
103
+ });
104
+ }
105
+ function notifyCurrent(_ref3) {
106
+ var eventName = _ref3.eventName,
107
+ payload = _ref3.payload;
108
+ var _iterator = _createForOfIteratorHelper(payload.location.current.dropTargets),
109
+ _step;
110
+ try {
111
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
112
+ var _entry$eventName;
113
+ var record = _step.value;
114
+ var entry = registry.get(record.element);
115
+ var _args = _objectSpread(_objectSpread({}, payload), {}, {
116
+ self: record
117
+ });
118
+ entry === null || entry === void 0 ? void 0 : (_entry$eventName = entry[eventName]) === null || _entry$eventName === void 0 ? void 0 : _entry$eventName.call(entry,
119
+ // I cannot seem to get the types right here.
120
+ // TS doesn't seem to like that one event can need `nativeSetDragImage`
121
+ // @ts-expect-error
122
+ _args);
123
+ }
124
+ } catch (err) {
125
+ _iterator.e(err);
126
+ } finally {
127
+ _iterator.f();
128
+ }
129
+ }
130
+ var actions = {
131
+ onGenerateDragPreview: notifyCurrent,
132
+ onDrag: notifyCurrent,
133
+ onDragStart: notifyCurrent,
134
+ onDrop: notifyCurrent,
135
+ onDropTargetChange: function onDropTargetChange(_ref4) {
136
+ var payload = _ref4.payload;
137
+ var isCurrent = new Set(payload.location.current.dropTargets.map(function (record) {
138
+ return record.element;
139
+ }));
140
+ var visited = new Set();
141
+ var _iterator2 = _createForOfIteratorHelper(payload.location.previous.dropTargets),
142
+ _step2;
143
+ try {
144
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
145
+ var _entry$onDropTargetCh;
146
+ var record = _step2.value;
147
+ visited.add(record.element);
148
+ var entry = registry.get(record.element);
149
+ var isOver = isCurrent.has(record.element);
150
+ var _args2 = _objectSpread(_objectSpread({}, payload), {}, {
151
+ self: record
152
+ });
153
+ entry === null || entry === void 0 ? void 0 : (_entry$onDropTargetCh = entry.onDropTargetChange) === null || _entry$onDropTargetCh === void 0 ? void 0 : _entry$onDropTargetCh.call(entry, _args2);
154
+
155
+ // if we cannot find the drop target in the current array, then it has been left
156
+ if (!isOver) {
157
+ var _entry$onDragLeave;
158
+ entry === null || entry === void 0 ? void 0 : (_entry$onDragLeave = entry.onDragLeave) === null || _entry$onDragLeave === void 0 ? void 0 : _entry$onDragLeave.call(entry, _args2);
159
+ }
160
+ }
161
+ } catch (err) {
162
+ _iterator2.e(err);
163
+ } finally {
164
+ _iterator2.f();
165
+ }
166
+ var _iterator3 = _createForOfIteratorHelper(payload.location.current.dropTargets),
167
+ _step3;
168
+ try {
169
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
170
+ var _entry$onDropTargetCh2, _entry$onDragEnter;
171
+ var _record = _step3.value;
172
+ // already published an update to this drop target
173
+ if (visited.has(_record.element)) {
174
+ continue;
175
+ }
176
+ // at this point we have a new drop target that is being entered into
177
+ var _args3 = _objectSpread(_objectSpread({}, payload), {}, {
178
+ self: _record
179
+ });
180
+ var _entry = registry.get(_record.element);
181
+ _entry === null || _entry === void 0 ? void 0 : (_entry$onDropTargetCh2 = _entry.onDropTargetChange) === null || _entry$onDropTargetCh2 === void 0 ? void 0 : _entry$onDropTargetCh2.call(_entry, _args3);
182
+ _entry === null || _entry === void 0 ? void 0 : (_entry$onDragEnter = _entry.onDragEnter) === null || _entry$onDragEnter === void 0 ? void 0 : _entry$onDragEnter.call(_entry, _args3);
183
+ }
184
+ } catch (err) {
185
+ _iterator3.e(err);
186
+ } finally {
187
+ _iterator3.f();
188
+ }
189
+ }
190
+ };
191
+ function dispatchEvent(args) {
192
+ // This line does not work in TS 4.2
193
+ // It does work in TS 4.7
194
+ // @ts-expect-error
195
+ actions[args.eventName](args);
196
+ }
197
+ function getIsOver(_ref5) {
198
+ var source = _ref5.source,
199
+ target = _ref5.target,
200
+ input = _ref5.input,
201
+ current = _ref5.current;
202
+ var actual = getActualDropTargets({
203
+ source: source,
204
+ target: target,
205
+ input: input
206
+ });
207
+
208
+ // stickiness is only relevant when we have less
209
+ // drop targets than we did before
210
+ if (actual.length >= current.length) {
211
+ return actual;
212
+ }
213
+
214
+ // less 'actual' drop targets than before,
215
+ // we need to see if 'stickiness' applies
216
+
217
+ // An old drop target will continue to be dropped on if:
218
+ // 1. it has the same parent
219
+ // 2. nothing exists in it's previous index
220
+
221
+ var lastCaptureOrdered = copyReverse(current);
222
+ var actualCaptureOrdered = copyReverse(actual);
223
+ var resultCaptureOrdered = [];
224
+ for (var index = 0; index < lastCaptureOrdered.length; index++) {
225
+ var last = lastCaptureOrdered[index];
226
+ var fresh = actualCaptureOrdered[index];
227
+
228
+ // if a record is in the new index -> use that
229
+ // it will have the latest data + dropEffect
230
+ if (fresh != null) {
231
+ resultCaptureOrdered.push(fresh);
232
+ continue;
233
+ }
234
+
235
+ // At this point we have no drop target in the old spot
236
+ // Check to see if we can use a previous sticky drop target
237
+
238
+ // stickiness is based on relationships to a parent
239
+ // so if we hit a drop target that is not sticky we
240
+ // can finish our search
241
+ if (!last.sticky) {
242
+ break;
243
+ }
244
+
245
+ // We only want the previous sticky item to 'stick' if
246
+ // the parent of the sticky item is unchanged
247
+
248
+ // The "parent" is the one inside of `resultCaptureOrdered`
249
+ // (the parent might be a drop target that was sticky)
250
+ var parent = resultCaptureOrdered[index - 1];
251
+ var lastParent = lastCaptureOrdered[index - 1];
252
+
253
+ // parents are the same (might both be undefined for index == 0)
254
+ // we can add the last entry and keep searching
255
+ if ((parent === null || parent === void 0 ? void 0 : parent.element) === (lastParent === null || lastParent === void 0 ? void 0 : lastParent.element)) {
256
+ resultCaptureOrdered.push(last);
257
+ continue;
258
+ }
259
+ // parents are not the same, we can exit our search
260
+ break;
261
+ }
262
+
263
+ // return bubble ordered result
264
+ return copyReverse(resultCaptureOrdered);
265
+ }
266
+ return {
267
+ dropTargetForConsumers: dropTargetForConsumers,
268
+ getIsOver: getIsOver,
269
+ dispatchEvent: dispatchEvent
270
+ };
271
+ }
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.makeMonitor = makeMonitor;
8
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
9
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
10
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
11
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
12
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
13
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
14
+ function makeMonitor() {
15
+ var registry = new Set();
16
+ var dragging = null;
17
+ function tryAddToActive(monitor) {
18
+ if (!dragging) {
19
+ return;
20
+ }
21
+ // Monitor is allowed to monitor events if:
22
+ // 1. It has no `canMonitor` function (default is that a monitor can listen to everything)
23
+ // 2. `canMonitor` returns true
24
+ if (!monitor.canMonitor || monitor.canMonitor(dragging.canMonitorArgs)) {
25
+ dragging.active.add(monitor);
26
+ }
27
+ }
28
+ function monitorForConsumers(args) {
29
+ // We are giving each `args` a new reference so that you
30
+ // can create multiple monitors with the same `args`.
31
+ var entry = _objectSpread({}, args);
32
+ registry.add(entry);
33
+
34
+ // if there is an active drag we need to see if this new monitor is relevant
35
+ tryAddToActive(entry);
36
+ return function cleanup() {
37
+ registry.delete(entry);
38
+
39
+ // We need to stop publishing events during a drag to this monitor!
40
+ if (dragging) {
41
+ dragging.active.delete(entry);
42
+ }
43
+ };
44
+ }
45
+ function dispatchEvent(_ref) {
46
+ var eventName = _ref.eventName,
47
+ payload = _ref.payload;
48
+ if (eventName === 'onGenerateDragPreview') {
49
+ dragging = {
50
+ canMonitorArgs: {
51
+ initial: payload.location.initial,
52
+ source: payload.source
53
+ },
54
+ active: new Set()
55
+ };
56
+ var _iterator = _createForOfIteratorHelper(registry),
57
+ _step;
58
+ try {
59
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
60
+ var monitor = _step.value;
61
+ tryAddToActive(monitor);
62
+ }
63
+ } catch (err) {
64
+ _iterator.e(err);
65
+ } finally {
66
+ _iterator.f();
67
+ }
68
+ }
69
+
70
+ // This should never happen.
71
+ if (!dragging) {
72
+ return;
73
+ }
74
+
75
+ // Creating an array from the set _before_ iterating
76
+ // This is so that monitors added during the current event will not be called.
77
+ // This behaviour matches native EventTargets where an event listener
78
+ // cannot add another event listener during an active event to the same
79
+ // event target in the same event (for us we have a single global event target)
80
+ var active = Array.from(dragging.active);
81
+ for (var _i = 0, _active = active; _i < _active.length; _i++) {
82
+ var _monitor = _active[_i];
83
+ // A monitor can be removed by another monitor during an event.
84
+ // We need to check that the monitor is still registered before calling it
85
+ if (dragging.active.has(_monitor)) {
86
+ var _monitor$eventName;
87
+ // @ts-expect-error: I cannot get this type working!
88
+ (_monitor$eventName = _monitor[eventName]) === null || _monitor$eventName === void 0 ? void 0 : _monitor$eventName.call(_monitor, payload);
89
+ }
90
+ }
91
+ if (eventName === 'onDrop') {
92
+ dragging.active.clear();
93
+ dragging = null;
94
+ }
95
+ }
96
+ return {
97
+ dispatchEvent: dispatchEvent,
98
+ monitorForConsumers: monitorForConsumers
99
+ };
100
+ }
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.addAttribute = addAttribute;
7
+ function addAttribute(element, _ref) {
8
+ var attribute = _ref.attribute,
9
+ value = _ref.value;
10
+ element.setAttribute(attribute, value);
11
+ return function () {
12
+ return element.removeAttribute(attribute);
13
+ };
14
+ }
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.combine = combine;
7
+ /** Create a new combined function that will call all the provided functions */
8
+ function combine() {
9
+ for (var _len = arguments.length, fns = new Array(_len), _key = 0; _key < _len; _key++) {
10
+ fns[_key] = arguments[_key];
11
+ }
12
+ return function cleanup() {
13
+ fns.forEach(function (fn) {
14
+ return fn();
15
+ });
16
+ };
17
+ }
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.disableNativeDragPreview = disableNativeDragPreview;
7
+ // In order to disable the native drag preview you can
8
+ // use `event.dataTransfer.setDragImage()` to set a small
9
+ // invisible image as the drag preview.
10
+ // There are alternative techniques,
11
+ // (eg setting opacity to in onGenerateDragPreview and then 1 in onDragStart)
12
+ // but the technique in this file worked best across browsers and platforms
13
+
14
+ // Here we are preloading the image so that it is ready for the first drag.
15
+ // Even though the image is base64 encoded, the browser queues an async task
16
+ // to decode the image. The image needs to be decoded before it can be used
17
+ var tinyTransparentImage = function () {
18
+ // SSR safe
19
+ if (typeof window === 'undefined') {
20
+ return null;
21
+ }
22
+
23
+ // Image generated by: https://png-pixel.com/
24
+ // It is a 1x1 transparent gif
25
+ // It is the smallest possible transparent image we could find that works on all platforms
26
+ // Note: using an encoded SVG would be nicer code, but it doesn't work on iOS
27
+ var img = new Image();
28
+ img.src = 'data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==';
29
+ return img;
30
+ }();
31
+ function disableNativeDragPreview(_ref) {
32
+ var nativeSetDragImage = _ref.nativeSetDragImage;
33
+ if (nativeSetDragImage && tinyTransparentImage) {
34
+ nativeSetDragImage(tinyTransparentImage, 0, 0);
35
+ }
36
+ }
@@ -0,0 +1,162 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.isEnteringWindow = isEnteringWindow;
7
+ exports.isLeavingWindow = isLeavingWindow;
8
+ var _bindEventListener = require("bind-event-listener");
9
+ // *Usually* to detect if you are entering / leaving a window you can
10
+ // use the `event.relatedTarget` property:
11
+
12
+ // "dragenter":
13
+ // - `event.relatedTarget` should point to the element that you are coming from
14
+ // - Scenario: A -> B
15
+ // - `event.target`: `B` (entering B)
16
+ // - `event.relatedTarget`: `A`: (leaving A - where you are coming from)
17
+ // - if `event.relatedTarget` is `null` then you are entering the window (coming from `null`)
18
+ //
19
+ // "dragleave"
20
+ // - `event.relatedTarget` should point to the element you are going to
21
+ // - Scenario: A -> B (entered B, leaving A)
22
+ // - `event.target`: `A` (leaving A)
23
+ // - `event.relatedTarget`: `B`: (entering into B - where you are going to)
24
+ // - if `event.relatedTarget` is `null` then you are leaving the window (going to `null`)
25
+ //
26
+ // Unfortunately in Safari `event.relatedTarget` is *always* set to `null`
27
+ // Safari bug: https://bugs.webkit.org/show_bug.cgi?id=242627
28
+ // To work around this we count "dragenter" and "dragleave" events
29
+ var safariFix = {
30
+ isSafari: false,
31
+ // Using symbols for event properties so we don't clash with
32
+ // anything on the `event` object
33
+ leavingWindow: Symbol('leaving'),
34
+ enteringWindow: Symbol('entering')
35
+ };
36
+ function isEnteringWindow(_ref) {
37
+ var dragEnter = _ref.dragEnter;
38
+ if (dragEnter.type !== 'dragenter') {
39
+ return false;
40
+ }
41
+ if (safariFix.isSafari) {
42
+ return dragEnter.hasOwnProperty(safariFix.enteringWindow);
43
+ }
44
+ // This is the standard check.
45
+ // if `relatedTarget` is `null` during a "dragenter"
46
+ // then we are entering the`window`
47
+ return dragEnter.relatedTarget == null;
48
+ }
49
+ function isLeavingWindow(_ref2) {
50
+ var dragLeave = _ref2.dragLeave;
51
+ if (dragLeave.type !== 'dragleave') {
52
+ return false;
53
+ }
54
+ if (safariFix.isSafari) {
55
+ return dragLeave.hasOwnProperty(safariFix.leavingWindow);
56
+ }
57
+ // This is the standard check.
58
+ // if `relatedTarget` is `null` during a "dragleave"
59
+ // then we are leave the `window`
60
+ return dragLeave.relatedTarget == null;
61
+ }
62
+
63
+ // NOTE: this fix currently has no test coverage
64
+ // - our drag and drop browser tests currently only run in Chrome due to tooling limitations
65
+ // - it didn't feel helpful to unit test as it is merely replicating a bug
66
+
67
+ (function fixSafari() {
68
+ // Don't do anything when server side rendering
69
+ if (typeof window === 'undefined') {
70
+ return;
71
+ }
72
+
73
+ // rather than checking the userAgent for "jsdom" we can do this check
74
+ // so that the check will be removed completely in production code
75
+ if (process.env.NODE_ENV === 'test') {
76
+ return;
77
+ }
78
+ var _navigator = navigator,
79
+ userAgent = _navigator.userAgent;
80
+ var isSafari = userAgent.includes('AppleWebKit') && !userAgent.includes('Chrome');
81
+ if (!isSafari) {
82
+ return;
83
+ }
84
+ safariFix.isSafari = true;
85
+ function getInitialState() {
86
+ return {
87
+ enterCount: 0,
88
+ isOverWindow: false
89
+ };
90
+ }
91
+ var state = getInitialState();
92
+ function resetState() {
93
+ state = getInitialState();
94
+ }
95
+
96
+ // These event listeners are bound _forever_ and _never_ removed
97
+ // We don't bother cleaning up these event listeners (for now)
98
+ // as this workaround is only for Safari
99
+
100
+ // This is how the event count works:
101
+ //
102
+ // lift (+1 enterCount)
103
+ // - dragstart(draggable) [enterCount: 0]
104
+ // - dragenter(draggable) [enterCount: 1]
105
+ // leaving draggable (+0 enterCount)
106
+ // - dragenter(document.body) [enterCount: 2]
107
+ // - dragleave(draggable) [enterCount: 1]
108
+ // leaving window (-1 enterCount)
109
+ // - dragleave(document.body) [enterCount: 0] {leaving the window}
110
+
111
+ // Things to note:
112
+ // - dragenter and dragleave bubble
113
+ // - the first dragenter when entering a window might not be on `window`
114
+ // - it could be on an element that is pressed up against the window
115
+ // - (so we cannot rely on `event.target` values)
116
+
117
+ (0, _bindEventListener.bindAll)(window, [{
118
+ type: 'dragstart',
119
+ listener: function listener() {
120
+ state.enterCount = 0;
121
+ // drag start occurs in the source window
122
+ state.isOverWindow = true;
123
+
124
+ // When a drag first starts it will also trigger a "dragenter" on the draggable element
125
+ }
126
+ }, {
127
+ type: 'drop',
128
+ listener: resetState
129
+ }, {
130
+ type: 'dragend',
131
+ listener: resetState
132
+ }, {
133
+ type: 'dragenter',
134
+ listener: function listener(event) {
135
+ if (!state.isOverWindow && state.enterCount === 0) {
136
+ // Patching the `event` object
137
+ // The `event` object is shared with all event listeners for the event
138
+ // @ts-ignore
139
+ event[safariFix.enteringWindow] = true;
140
+ }
141
+ state.isOverWindow = true;
142
+ state.enterCount++;
143
+ }
144
+ }, {
145
+ type: 'dragleave',
146
+ listener: function listener(event) {
147
+ state.enterCount--;
148
+ if (state.isOverWindow && state.enterCount === 0) {
149
+ // Patching the `event` object as it is shared with all event listeners
150
+ // The `event` object is shared with all event listeners for the event
151
+ // @ts-ignore
152
+ event[safariFix.leavingWindow] = true;
153
+ state.isOverWindow = false;
154
+ }
155
+ }
156
+ }],
157
+ // using `capture: true` so that adding event listeners
158
+ // in bubble phase will have the correct symbols
159
+ {
160
+ capture: true
161
+ });
162
+ })();