@helpdice/draggable 0.0.0-stage → 0.0.1

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 (472) hide show
  1. package/LICENSE +13 -0
  2. package/README.md +164 -2
  3. package/dist/draggable.cjs.js +9915 -0
  4. package/dist/draggable.cjs.js.map +1 -0
  5. package/dist/draggable.esm.js +9889 -0
  6. package/dist/draggable.esm.js.map +1 -0
  7. package/dist/types/animation.d.ts +31 -0
  8. package/dist/types/debug/middleware/action-timing-average.d.ts +3 -0
  9. package/dist/types/debug/middleware/action-timing.d.ts +3 -0
  10. package/dist/types/debug/middleware/log.d.ts +4 -0
  11. package/dist/types/debug/middleware/user-timing.d.ts +3 -0
  12. package/dist/types/debug/timings.d.ts +3 -0
  13. package/dist/types/dev-warning.d.ts +4 -0
  14. package/dist/types/empty.d.ts +2 -0
  15. package/dist/types/index.d.ts +8 -0
  16. package/dist/types/invariant.d.ts +4 -0
  17. package/dist/types/native-with-fallback.d.ts +10 -0
  18. package/dist/types/screen-reader-message-preset.d.ts +9 -0
  19. package/dist/types/state/action-creators.d.ts +158 -0
  20. package/dist/types/state/auto-scroller/auto-scroller-types.d.ts +6 -0
  21. package/dist/types/state/auto-scroller/can-scroll.d.ts +19 -0
  22. package/dist/types/state/auto-scroller/fluid-scroller/config.d.ts +11 -0
  23. package/dist/types/state/auto-scroller/fluid-scroller/did-start-in-scrollable-area.d.ts +0 -0
  24. package/dist/types/state/auto-scroller/fluid-scroller/get-best-scrollable-droppable.d.ts +9 -0
  25. package/dist/types/state/auto-scroller/fluid-scroller/get-droppable-scroll-change.d.ts +11 -0
  26. package/dist/types/state/auto-scroller/fluid-scroller/get-percentage.d.ts +7 -0
  27. package/dist/types/state/auto-scroller/fluid-scroller/get-scroll/adjust-for-size-limits.d.ts +8 -0
  28. package/dist/types/state/auto-scroller/fluid-scroller/get-scroll/get-scroll-on-axis/dampen-value-by-time.d.ts +2 -0
  29. package/dist/types/state/auto-scroller/fluid-scroller/get-scroll/get-scroll-on-axis/get-distance-thresholds.d.ts +8 -0
  30. package/dist/types/state/auto-scroller/fluid-scroller/get-scroll/get-scroll-on-axis/get-value-from-distance.d.ts +3 -0
  31. package/dist/types/state/auto-scroller/fluid-scroller/get-scroll/get-scroll-on-axis/get-value.d.ts +9 -0
  32. package/dist/types/state/auto-scroller/fluid-scroller/get-scroll/get-scroll-on-axis/index.d.ts +11 -0
  33. package/dist/types/state/auto-scroller/fluid-scroller/get-scroll/get-scroll-on-axis/min-scroll.d.ts +2 -0
  34. package/dist/types/state/auto-scroller/fluid-scroller/get-scroll/index.d.ts +10 -0
  35. package/dist/types/state/auto-scroller/fluid-scroller/get-window-scroll-change.d.ts +11 -0
  36. package/dist/types/state/auto-scroller/fluid-scroller/index.d.ts +13 -0
  37. package/dist/types/state/auto-scroller/fluid-scroller/scroll.d.ts +11 -0
  38. package/dist/types/state/auto-scroller/index.d.ts +11 -0
  39. package/dist/types/state/auto-scroller/jump-scroller.d.ts +11 -0
  40. package/dist/types/state/axis.d.ts +3 -0
  41. package/dist/types/state/calculate-drag-impact/calculate-reorder-impact.d.ts +13 -0
  42. package/dist/types/state/can-start-drag.d.ts +3 -0
  43. package/dist/types/state/create-store.d.ts +16 -0
  44. package/dist/types/state/did-start-after-critical.d.ts +2 -0
  45. package/dist/types/state/dimension-marshal/dimension-marshal-types.d.ts +23 -0
  46. package/dist/types/state/dimension-marshal/dimension-marshal.d.ts +4 -0
  47. package/dist/types/state/dimension-marshal/get-initial-publish.d.ts +10 -0
  48. package/dist/types/state/dimension-marshal/while-dragging-publisher.d.ts +17 -0
  49. package/dist/types/state/dimension-structures.d.ts +5 -0
  50. package/dist/types/state/droppable/get-droppable.d.ts +21 -0
  51. package/dist/types/state/droppable/is-home-of.d.ts +3 -0
  52. package/dist/types/state/droppable/scroll-droppable.d.ts +4 -0
  53. package/dist/types/state/droppable/should-use-placeholder.d.ts +3 -0
  54. package/dist/types/state/droppable/util/clip.d.ts +3 -0
  55. package/dist/types/state/droppable/util/get-subject.d.ts +10 -0
  56. package/dist/types/state/droppable/what-is-dragged-over-from-result.d.ts +3 -0
  57. package/dist/types/state/droppable/what-is-dragged-over.d.ts +3 -0
  58. package/dist/types/state/droppable/with-placeholder.d.ts +3 -0
  59. package/dist/types/state/get-center-from-impact/get-client-border-box-center/get-client-from-page-border-box-center.d.ts +9 -0
  60. package/dist/types/state/get-center-from-impact/get-client-border-box-center/index.d.ts +12 -0
  61. package/dist/types/state/get-center-from-impact/get-page-border-box-center/index.d.ts +11 -0
  62. package/dist/types/state/get-center-from-impact/get-page-border-box-center/when-combining.d.ts +9 -0
  63. package/dist/types/state/get-center-from-impact/get-page-border-box-center/when-reordering.d.ts +11 -0
  64. package/dist/types/state/get-center-from-impact/move-relative-to.d.ts +16 -0
  65. package/dist/types/state/get-combined-item-displacement.d.ts +10 -0
  66. package/dist/types/state/get-displaced-by.d.ts +4 -0
  67. package/dist/types/state/get-displacement-groups.d.ts +12 -0
  68. package/dist/types/state/get-drag-impact/get-combine-impact.d.ts +13 -0
  69. package/dist/types/state/get-drag-impact/get-reorder-impact.d.ts +13 -0
  70. package/dist/types/state/get-drag-impact/index.d.ts +13 -0
  71. package/dist/types/state/get-draggables-inside-droppable.d.ts +3 -0
  72. package/dist/types/state/get-droppable-over.d.ts +9 -0
  73. package/dist/types/state/get-frame.d.ts +3 -0
  74. package/dist/types/state/get-home-location.d.ts +3 -0
  75. package/dist/types/state/get-impact-location.d.ts +3 -0
  76. package/dist/types/state/get-is-displaced.d.ts +7 -0
  77. package/dist/types/state/get-lift-effect.d.ts +13 -0
  78. package/dist/types/state/get-max-scroll.d.ts +9 -0
  79. package/dist/types/state/is-movement-allowed.d.ts +2 -0
  80. package/dist/types/state/is-within.d.ts +2 -0
  81. package/dist/types/state/middleware/auto-scroll.d.ts +4 -0
  82. package/dist/types/state/middleware/dimension-marshal-stopper.d.ts +4 -0
  83. package/dist/types/state/middleware/drop/drop-animation-finish-middleware.d.ts +3 -0
  84. package/dist/types/state/middleware/drop/drop-animation-flush-on-scroll-middleware.d.ts +3 -0
  85. package/dist/types/state/middleware/drop/drop-middleware.d.ts +3 -0
  86. package/dist/types/state/middleware/drop/get-drop-duration.d.ts +9 -0
  87. package/dist/types/state/middleware/drop/get-drop-impact.d.ts +16 -0
  88. package/dist/types/state/middleware/drop/get-new-home-client-offset.d.ts +11 -0
  89. package/dist/types/state/middleware/drop/index.d.ts +1 -0
  90. package/dist/types/state/middleware/focus.d.ts +4 -0
  91. package/dist/types/state/middleware/lift.d.ts +4 -0
  92. package/dist/types/state/middleware/pending-drop.d.ts +3 -0
  93. package/dist/types/state/middleware/responders/async-marshal.d.ts +9 -0
  94. package/dist/types/state/middleware/responders/expiring-announce.d.ts +6 -0
  95. package/dist/types/state/middleware/responders/index.d.ts +1 -0
  96. package/dist/types/state/middleware/responders/is-equal.d.ts +4 -0
  97. package/dist/types/state/middleware/responders/publisher.d.ts +17 -0
  98. package/dist/types/state/middleware/responders/responders-middleware.d.ts +4 -0
  99. package/dist/types/state/middleware/scroll-listener.d.ts +3 -0
  100. package/dist/types/state/middleware/style.d.ts +4 -0
  101. package/dist/types/state/middleware/util/validate-dimensions.d.ts +2 -0
  102. package/dist/types/state/move-in-direction/index.d.ts +8 -0
  103. package/dist/types/state/move-in-direction/move-cross-axis/get-best-cross-axis-droppable.d.ts +11 -0
  104. package/dist/types/state/move-in-direction/move-cross-axis/get-closest-draggable.d.ts +11 -0
  105. package/dist/types/state/move-in-direction/move-cross-axis/index.d.ts +15 -0
  106. package/dist/types/state/move-in-direction/move-cross-axis/move-to-new-droppable.d.ts +14 -0
  107. package/dist/types/state/move-in-direction/move-cross-axis/without-starting-displacement.d.ts +4 -0
  108. package/dist/types/state/move-in-direction/move-in-direction-types.d.ts +7 -0
  109. package/dist/types/state/move-in-direction/move-to-next-place/index.d.ts +16 -0
  110. package/dist/types/state/move-in-direction/move-to-next-place/is-totally-visible-in-new-location.d.ts +12 -0
  111. package/dist/types/state/move-in-direction/move-to-next-place/move-to-next-combine/index.d.ts +10 -0
  112. package/dist/types/state/move-in-direction/move-to-next-place/move-to-next-index/from-combine.d.ts +11 -0
  113. package/dist/types/state/move-in-direction/move-to-next-place/move-to-next-index/from-reorder.d.ts +9 -0
  114. package/dist/types/state/move-in-direction/move-to-next-place/move-to-next-index/index.d.ts +14 -0
  115. package/dist/types/state/no-impact.d.ts +6 -0
  116. package/dist/types/state/patch-dimension-map.d.ts +3 -0
  117. package/dist/types/state/patch-droppable-map.d.ts +3 -0
  118. package/dist/types/state/position.d.ts +10 -0
  119. package/dist/types/state/post-reducer/when-moving/refresh-snap.d.ts +8 -0
  120. package/dist/types/state/post-reducer/when-moving/update.d.ts +12 -0
  121. package/dist/types/state/publish-while-dragging-in-virtual/adjust-additions-for-scroll-changes.d.ts +8 -0
  122. package/dist/types/state/publish-while-dragging-in-virtual/index.d.ts +7 -0
  123. package/dist/types/state/publish-while-dragging-in-virtual/offset-draggable.d.ts +9 -0
  124. package/dist/types/state/recompute-placeholders.d.ts +10 -0
  125. package/dist/types/state/rect.d.ts +2 -0
  126. package/dist/types/state/reducer.d.ts +5 -0
  127. package/dist/types/state/registry/create-registry.d.ts +2 -0
  128. package/dist/types/state/registry/registry-types.d.ts +62 -0
  129. package/dist/types/state/registry/use-registry.d.ts +2 -0
  130. package/dist/types/state/remove-draggable-from-list.d.ts +3 -0
  131. package/dist/types/state/scroll-viewport.d.ts +4 -0
  132. package/dist/types/state/spacing.d.ts +6 -0
  133. package/dist/types/state/store-types.d.ts +10 -0
  134. package/dist/types/state/update-displacement-visibility/recompute.d.ts +10 -0
  135. package/dist/types/state/update-displacement-visibility/speculatively-increase.d.ts +11 -0
  136. package/dist/types/state/visibility/is-partially-visible-through-frame.d.ts +3 -0
  137. package/dist/types/state/visibility/is-position-in-frame.d.ts +2 -0
  138. package/dist/types/state/visibility/is-totally-visible-through-frame-on-axis.d.ts +4 -0
  139. package/dist/types/state/visibility/is-totally-visible-through-frame.d.ts +3 -0
  140. package/dist/types/state/visibility/is-visible.d.ts +13 -0
  141. package/dist/types/state/with-scroll-change/with-all-displacement.d.ts +4 -0
  142. package/dist/types/state/with-scroll-change/with-droppable-displacement.d.ts +4 -0
  143. package/dist/types/state/with-scroll-change/with-droppable-scroll.d.ts +4 -0
  144. package/dist/types/state/with-scroll-change/with-viewport-displacement.d.ts +4 -0
  145. package/dist/types/types.d.ts +323 -0
  146. package/dist/types/view/animate-in-out/animate-in-out.d.ts +24 -0
  147. package/dist/types/view/animate-in-out/index.d.ts +1 -0
  148. package/dist/types/view/check-is-valid-inner-ref.d.ts +1 -0
  149. package/dist/types/view/context/app-context.d.ts +16 -0
  150. package/dist/types/view/context/droppable-context.d.ts +9 -0
  151. package/dist/types/view/context/hooks.d.ts +3 -0
  152. package/dist/types/view/context/store-context.d.ts +4 -0
  153. package/dist/types/view/data-attributes.d.ts +22 -0
  154. package/dist/types/view/drag-drop-context/app.d.ts +13 -0
  155. package/dist/types/view/drag-drop-context/check-doctype.d.ts +2 -0
  156. package/dist/types/view/drag-drop-context/check-react-version.d.ts +2 -0
  157. package/dist/types/view/drag-drop-context/drag-drop-context-types.d.ts +5 -0
  158. package/dist/types/view/drag-drop-context/drag-drop-context.d.ts +12 -0
  159. package/dist/types/view/drag-drop-context/error-boundary.d.ts +20 -0
  160. package/dist/types/view/drag-drop-context/index.d.ts +1 -0
  161. package/dist/types/view/drag-drop-context/use-startup-validation.d.ts +1 -0
  162. package/dist/types/view/drag-drop-context/use-unique-context-id.d.ts +3 -0
  163. package/dist/types/view/draggable/connected-draggable.d.ts +5 -0
  164. package/dist/types/view/draggable/draggable-api.d.ts +3 -0
  165. package/dist/types/view/draggable/draggable-types.d.ts +106 -0
  166. package/dist/types/view/draggable/draggable.d.ts +2 -0
  167. package/dist/types/view/draggable/get-style.d.ts +3 -0
  168. package/dist/types/view/draggable/index.d.ts +1 -0
  169. package/dist/types/view/draggable/use-validation.d.ts +4 -0
  170. package/dist/types/view/droppable/connected-droppable.d.ts +7 -0
  171. package/dist/types/view/droppable/droppable-types.d.ts +50 -0
  172. package/dist/types/view/droppable/droppable.d.ts +2 -0
  173. package/dist/types/view/droppable/index.d.ts +1 -0
  174. package/dist/types/view/droppable/use-validation.d.ts +8 -0
  175. package/dist/types/view/event-bindings/bind-events.d.ts +2 -0
  176. package/dist/types/view/event-bindings/event-types.d.ts +10 -0
  177. package/dist/types/view/get-body-element.d.ts +2 -0
  178. package/dist/types/view/get-border-box-center-position.d.ts +3 -0
  179. package/dist/types/view/get-document-element.d.ts +2 -0
  180. package/dist/types/view/get-elements/find-drag-handle.d.ts +2 -0
  181. package/dist/types/view/get-elements/find-draggable.d.ts +2 -0
  182. package/dist/types/view/is-strict-equal.d.ts +2 -0
  183. package/dist/types/view/is-type-of-element/is-element.d.ts +1 -0
  184. package/dist/types/view/is-type-of-element/is-html-element.d.ts +1 -0
  185. package/dist/types/view/is-type-of-element/is-svg-element.d.ts +1 -0
  186. package/dist/types/view/key-codes.d.ts +12 -0
  187. package/dist/types/view/placeholder/index.d.ts +1 -0
  188. package/dist/types/view/placeholder/placeholder-types.d.ts +14 -0
  189. package/dist/types/view/placeholder/placeholder.d.ts +28 -0
  190. package/dist/types/view/scroll-listener.d.ts +12 -0
  191. package/dist/types/view/throw-if-invalid-inner-ref.d.ts +2 -0
  192. package/dist/types/view/use-announcer/index.d.ts +1 -0
  193. package/dist/types/view/use-announcer/use-announcer.d.ts +3 -0
  194. package/dist/types/view/use-dev-setup-warning.d.ts +1 -0
  195. package/dist/types/view/use-dev.d.ts +1 -0
  196. package/dist/types/view/use-draggable-publisher/get-dimension.d.ts +3 -0
  197. package/dist/types/view/use-draggable-publisher/index.d.ts +1 -0
  198. package/dist/types/view/use-draggable-publisher/use-draggable-publisher.d.ts +8 -0
  199. package/dist/types/view/use-droppable-publisher/check-for-nested-scroll-container.d.ts +2 -0
  200. package/dist/types/view/use-droppable-publisher/get-closest-scrollable.d.ts +2 -0
  201. package/dist/types/view/use-droppable-publisher/get-dimension.d.ts +15 -0
  202. package/dist/types/view/use-droppable-publisher/get-env.d.ts +6 -0
  203. package/dist/types/view/use-droppable-publisher/get-listener-options.d.ts +5 -0
  204. package/dist/types/view/use-droppable-publisher/get-scroll.d.ts +3 -0
  205. package/dist/types/view/use-droppable-publisher/index.d.ts +1 -0
  206. package/dist/types/view/use-droppable-publisher/is-in-fixed-container.d.ts +2 -0
  207. package/dist/types/view/use-droppable-publisher/use-droppable-publisher.d.ts +13 -0
  208. package/dist/types/view/use-focus-marshal/focus-marshal-types.d.ts +9 -0
  209. package/dist/types/view/use-focus-marshal/index.d.ts +1 -0
  210. package/dist/types/view/use-focus-marshal/use-focus-marshal.d.ts +3 -0
  211. package/dist/types/view/use-hidden-text-element/index.d.ts +1 -0
  212. package/dist/types/view/use-hidden-text-element/use-hidden-text-element.d.ts +12 -0
  213. package/dist/types/view/use-isomorphic-layout-effect.d.ts +3 -0
  214. package/dist/types/view/use-previous-ref.d.ts +1 -0
  215. package/dist/types/view/use-required-context.d.ts +2 -0
  216. package/dist/types/view/use-sensor-marshal/closest.d.ts +1 -0
  217. package/dist/types/view/use-sensor-marshal/find-closest-draggable-id-from-event.d.ts +2 -0
  218. package/dist/types/view/use-sensor-marshal/index.d.ts +4 -0
  219. package/dist/types/view/use-sensor-marshal/is-event-in-interactive-element.d.ts +5 -0
  220. package/dist/types/view/use-sensor-marshal/lock.d.ts +11 -0
  221. package/dist/types/view/use-sensor-marshal/sensors/use-keyboard-sensor.d.ts +2 -0
  222. package/dist/types/view/use-sensor-marshal/sensors/use-mouse-sensor.d.ts +4 -0
  223. package/dist/types/view/use-sensor-marshal/sensors/use-touch-sensor.d.ts +4 -0
  224. package/dist/types/view/use-sensor-marshal/sensors/util/prevent-standard-key-events.d.ts +2 -0
  225. package/dist/types/view/use-sensor-marshal/sensors/util/supported-page-visibility-event-name.d.ts +2 -0
  226. package/dist/types/view/use-sensor-marshal/use-sensor-marshal.d.ts +12 -0
  227. package/dist/types/view/use-sensor-marshal/use-validate-sensor-hooks.d.ts +2 -0
  228. package/dist/types/view/use-style-marshal/get-styles.d.ts +10 -0
  229. package/dist/types/view/use-style-marshal/index.d.ts +1 -0
  230. package/dist/types/view/use-style-marshal/style-marshal-types.d.ts +6 -0
  231. package/dist/types/view/use-style-marshal/use-style-marshal.d.ts +3 -0
  232. package/dist/types/view/use-unique-id.d.ts +7 -0
  233. package/dist/types/view/visually-hidden-style.d.ts +2 -0
  234. package/dist/types/view/window/get-max-window-scroll.d.ts +3 -0
  235. package/dist/types/view/window/get-viewport.d.ts +3 -0
  236. package/dist/types/view/window/get-window-from-el.d.ts +2 -0
  237. package/dist/types/view/window/get-window-scroll.d.ts +3 -0
  238. package/dist/types/view/window/scroll-window.d.ts +3 -0
  239. package/package.json +157 -4
  240. package/src/animation.ts +75 -0
  241. package/src/debug/middleware/action-timing-average.ts +52 -0
  242. package/src/debug/middleware/action-timing.ts +16 -0
  243. package/src/debug/middleware/log.ts +26 -0
  244. package/src/debug/middleware/user-timing.ts +16 -0
  245. package/src/debug/timings.ts +87 -0
  246. package/src/dev-warning.ts +50 -0
  247. package/src/empty.ts +6 -0
  248. package/src/index.ts +67 -0
  249. package/src/invariant.ts +64 -0
  250. package/src/native-with-fallback.ts +69 -0
  251. package/src/screen-reader-message-preset.ts +135 -0
  252. package/src/state/action-creators.ts +358 -0
  253. package/src/state/auto-scroller/auto-scroller-types.ts +8 -0
  254. package/src/state/auto-scroller/can-scroll.ts +320 -0
  255. package/src/state/auto-scroller/fluid-scroller/config.ts +25 -0
  256. package/src/state/auto-scroller/fluid-scroller/did-start-in-scrollable-area.ts +1 -0
  257. package/src/state/auto-scroller/fluid-scroller/get-best-scrollable-droppable.ts +77 -0
  258. package/src/state/auto-scroller/fluid-scroller/get-droppable-scroll-change.ts +39 -0
  259. package/src/state/auto-scroller/fluid-scroller/get-percentage.ts +25 -0
  260. package/src/state/auto-scroller/fluid-scroller/get-scroll/adjust-for-size-limits.ts +30 -0
  261. package/src/state/auto-scroller/fluid-scroller/get-scroll/get-scroll-on-axis/dampen-value-by-time.ts +37 -0
  262. package/src/state/auto-scroller/fluid-scroller/get-scroll/get-scroll-on-axis/get-distance-thresholds.ts +25 -0
  263. package/src/state/auto-scroller/fluid-scroller/get-scroll/get-scroll-on-axis/get-value-from-distance.ts +61 -0
  264. package/src/state/auto-scroller/fluid-scroller/get-scroll/get-scroll-on-axis/get-value.ts +39 -0
  265. package/src/state/auto-scroller/fluid-scroller/get-scroll/get-scroll-on-axis/index.ts +46 -0
  266. package/src/state/auto-scroller/fluid-scroller/get-scroll/get-scroll-on-axis/min-scroll.ts +4 -0
  267. package/src/state/auto-scroller/fluid-scroller/get-scroll/index.ts +76 -0
  268. package/src/state/auto-scroller/fluid-scroller/get-window-scroll-change.ts +31 -0
  269. package/src/state/auto-scroller/fluid-scroller/index.ts +91 -0
  270. package/src/state/auto-scroller/fluid-scroller/scroll.ts +72 -0
  271. package/src/state/auto-scroller/index.ts +56 -0
  272. package/src/state/auto-scroller/jump-scroller.ts +140 -0
  273. package/src/state/axis.ts +26 -0
  274. package/src/state/calculate-drag-impact/calculate-reorder-impact.ts +138 -0
  275. package/src/state/can-start-drag.ts +29 -0
  276. package/src/state/create-store.ts +98 -0
  277. package/src/state/did-start-after-critical.ts +9 -0
  278. package/src/state/dimension-marshal/dimension-marshal-types.ts +49 -0
  279. package/src/state/dimension-marshal/dimension-marshal.ts +219 -0
  280. package/src/state/dimension-marshal/get-initial-publish.ts +66 -0
  281. package/src/state/dimension-marshal/while-dragging-publisher.ts +146 -0
  282. package/src/state/dimension-structures.ts +35 -0
  283. package/src/state/droppable/get-droppable.ts +103 -0
  284. package/src/state/droppable/is-home-of.ts +7 -0
  285. package/src/state/droppable/scroll-droppable.ts +53 -0
  286. package/src/state/droppable/should-use-placeholder.ts +7 -0
  287. package/src/state/droppable/util/clip.ts +17 -0
  288. package/src/state/droppable/util/get-subject.ts +63 -0
  289. package/src/state/droppable/what-is-dragged-over-from-result.ts +16 -0
  290. package/src/state/droppable/what-is-dragged-over.ts +16 -0
  291. package/src/state/droppable/with-placeholder.ts +174 -0
  292. package/src/state/get-center-from-impact/get-client-border-box-center/get-client-from-page-border-box-center.ts +30 -0
  293. package/src/state/get-center-from-impact/get-client-border-box-center/index.ts +45 -0
  294. package/src/state/get-center-from-impact/get-page-border-box-center/index.ts +71 -0
  295. package/src/state/get-center-from-impact/get-page-border-box-center/when-combining.ts +40 -0
  296. package/src/state/get-center-from-impact/get-page-border-box-center/when-reordering.ts +113 -0
  297. package/src/state/get-center-from-impact/move-relative-to.ts +68 -0
  298. package/src/state/get-combined-item-displacement.ts +35 -0
  299. package/src/state/get-displaced-by.ts +17 -0
  300. package/src/state/get-displacement-groups.ts +131 -0
  301. package/src/state/get-drag-impact/get-combine-impact.ts +131 -0
  302. package/src/state/get-drag-impact/get-reorder-impact.ts +145 -0
  303. package/src/state/get-drag-impact/index.ts +94 -0
  304. package/src/state/get-draggables-inside-droppable.ts +31 -0
  305. package/src/state/get-droppable-over.ts +161 -0
  306. package/src/state/get-frame.ts +10 -0
  307. package/src/state/get-home-location.ts +7 -0
  308. package/src/state/get-impact-location.ts +16 -0
  309. package/src/state/get-is-displaced.ts +12 -0
  310. package/src/state/get-lift-effect.ts +84 -0
  311. package/src/state/get-max-scroll.ts +32 -0
  312. package/src/state/is-movement-allowed.ts +13 -0
  313. package/src/state/is-within.ts +9 -0
  314. package/src/state/middleware/auto-scroll.ts +38 -0
  315. package/src/state/middleware/dimension-marshal-stopper.ts +20 -0
  316. package/src/state/middleware/drop/drop-animation-finish-middleware.ts +21 -0
  317. package/src/state/middleware/drop/drop-animation-flush-on-scroll-middleware.ts +63 -0
  318. package/src/state/middleware/drop/drop-middleware.ts +146 -0
  319. package/src/state/middleware/drop/get-drop-duration.ts +48 -0
  320. package/src/state/middleware/drop/get-drop-impact.ts +79 -0
  321. package/src/state/middleware/drop/get-new-home-client-offset.ts +55 -0
  322. package/src/state/middleware/drop/index.ts +2 -0
  323. package/src/state/middleware/focus.ts +42 -0
  324. package/src/state/middleware/lift.ts +66 -0
  325. package/src/state/middleware/pending-drop.ts +37 -0
  326. package/src/state/middleware/responders/async-marshal.ts +58 -0
  327. package/src/state/middleware/responders/expiring-announce.ts +44 -0
  328. package/src/state/middleware/responders/index.ts +2 -0
  329. package/src/state/middleware/responders/is-equal.ts +57 -0
  330. package/src/state/middleware/responders/publisher.ts +255 -0
  331. package/src/state/middleware/responders/responders-middleware.ts +81 -0
  332. package/src/state/middleware/scroll-listener.ts +31 -0
  333. package/src/state/middleware/style.ts +22 -0
  334. package/src/state/middleware/util/validate-dimensions.ts +71 -0
  335. package/src/state/move-in-direction/index.ts +85 -0
  336. package/src/state/move-in-direction/move-cross-axis/get-best-cross-axis-droppable.ts +169 -0
  337. package/src/state/move-in-direction/move-cross-axis/get-closest-draggable.ts +80 -0
  338. package/src/state/move-in-direction/move-cross-axis/index.ts +110 -0
  339. package/src/state/move-in-direction/move-cross-axis/move-to-new-droppable.ts +122 -0
  340. package/src/state/move-in-direction/move-cross-axis/without-starting-displacement.ts +31 -0
  341. package/src/state/move-in-direction/move-in-direction-types.ts +10 -0
  342. package/src/state/move-in-direction/move-to-next-place/index.ts +133 -0
  343. package/src/state/move-in-direction/move-to-next-place/is-totally-visible-in-new-location.ts +53 -0
  344. package/src/state/move-in-direction/move-to-next-place/move-to-next-combine/index.ts +98 -0
  345. package/src/state/move-in-direction/move-to-next-place/move-to-next-index/from-combine.ts +53 -0
  346. package/src/state/move-in-direction/move-to-next-place/move-to-next-index/from-reorder.ts +44 -0
  347. package/src/state/move-in-direction/move-to-next-place/move-to-next-index/index.ts +87 -0
  348. package/src/state/no-impact.ts +33 -0
  349. package/src/state/patch-dimension-map.ts +11 -0
  350. package/src/state/patch-droppable-map.ts +10 -0
  351. package/src/state/position.ts +65 -0
  352. package/src/state/post-reducer/when-moving/refresh-snap.ts +68 -0
  353. package/src/state/post-reducer/when-moving/update.ts +121 -0
  354. package/src/state/publish-while-dragging-in-virtual/adjust-additions-for-scroll-changes.ts +59 -0
  355. package/src/state/publish-while-dragging-in-virtual/index.ts +159 -0
  356. package/src/state/publish-while-dragging-in-virtual/offset-draggable.ts +36 -0
  357. package/src/state/recompute-placeholders.ts +101 -0
  358. package/src/state/rect.ts +7 -0
  359. package/src/state/reducer.ts +467 -0
  360. package/src/state/registry/create-registry.ts +162 -0
  361. package/src/state/registry/registry-types.ts +106 -0
  362. package/src/state/registry/use-registry.ts +20 -0
  363. package/src/state/remove-draggable-from-list.ts +13 -0
  364. package/src/state/scroll-viewport.ts +34 -0
  365. package/src/state/spacing.ts +45 -0
  366. package/src/state/store-types.ts +19 -0
  367. package/src/state/update-displacement-visibility/recompute.ts +55 -0
  368. package/src/state/update-displacement-visibility/speculatively-increase.ts +112 -0
  369. package/src/state/visibility/is-partially-visible-through-frame.ts +60 -0
  370. package/src/state/visibility/is-position-in-frame.ts +12 -0
  371. package/src/state/visibility/is-totally-visible-through-frame-on-axis.ts +19 -0
  372. package/src/state/visibility/is-totally-visible-through-frame.ts +18 -0
  373. package/src/state/visibility/is-visible.ts +102 -0
  374. package/src/state/with-scroll-change/with-all-displacement.ts +15 -0
  375. package/src/state/with-scroll-change/with-droppable-displacement.ts +13 -0
  376. package/src/state/with-scroll-change/with-droppable-scroll.ts +13 -0
  377. package/src/state/with-scroll-change/with-viewport-displacement.ts +7 -0
  378. package/src/types/redux-devtools.d.ts +17 -0
  379. package/src/types.ts +495 -0
  380. package/src/view/animate-in-out/animate-in-out.tsx +98 -0
  381. package/src/view/animate-in-out/index.ts +2 -0
  382. package/src/view/check-is-valid-inner-ref.ts +15 -0
  383. package/src/view/context/app-context.ts +19 -0
  384. package/src/view/context/droppable-context.ts +12 -0
  385. package/src/view/context/hooks.ts +21 -0
  386. package/src/view/context/store-context.ts +8 -0
  387. package/src/view/data-attributes.ts +37 -0
  388. package/src/view/drag-drop-context/app.tsx +300 -0
  389. package/src/view/drag-drop-context/check-doctype.ts +39 -0
  390. package/src/view/drag-drop-context/check-react-version.ts +72 -0
  391. package/src/view/drag-drop-context/drag-drop-context-types.ts +8 -0
  392. package/src/view/drag-drop-context/drag-drop-context.tsx +60 -0
  393. package/src/view/drag-drop-context/error-boundary.tsx +89 -0
  394. package/src/view/drag-drop-context/index.ts +2 -0
  395. package/src/view/drag-drop-context/use-startup-validation.ts +13 -0
  396. package/src/view/drag-drop-context/use-unique-context-id.ts +13 -0
  397. package/src/view/draggable/connected-draggable.tsx +420 -0
  398. package/src/view/draggable/draggable-api.tsx +48 -0
  399. package/src/view/draggable/draggable-types.ts +204 -0
  400. package/src/view/draggable/draggable.tsx +167 -0
  401. package/src/view/draggable/get-style.ts +109 -0
  402. package/src/view/draggable/index.ts +2 -0
  403. package/src/view/draggable/use-validation.ts +70 -0
  404. package/src/view/droppable/connected-droppable.tsx +597 -0
  405. package/src/view/droppable/droppable-types.ts +96 -0
  406. package/src/view/droppable/droppable.tsx +167 -0
  407. package/src/view/droppable/index.ts +2 -0
  408. package/src/view/droppable/use-validation.ts +102 -0
  409. package/src/view/event-bindings/bind-events.ts +39 -0
  410. package/src/view/event-bindings/event-types.ts +15 -0
  411. package/src/view/get-body-element.ts +8 -0
  412. package/src/view/get-border-box-center-position.ts +5 -0
  413. package/src/view/get-document-element.ts +8 -0
  414. package/src/view/get-elements/find-drag-handle.ts +38 -0
  415. package/src/view/get-elements/find-draggable.ts +30 -0
  416. package/src/view/is-strict-equal.ts +2 -0
  417. package/src/view/is-type-of-element/is-element.ts +10 -0
  418. package/src/view/is-type-of-element/is-html-element.ts +10 -0
  419. package/src/view/is-type-of-element/is-svg-element.ts +22 -0
  420. package/src/view/key-codes.ts +13 -0
  421. package/src/view/placeholder/index.ts +2 -0
  422. package/src/view/placeholder/placeholder-types.ts +16 -0
  423. package/src/view/placeholder/placeholder.tsx +204 -0
  424. package/src/view/scroll-listener.ts +74 -0
  425. package/src/view/throw-if-invalid-inner-ref.ts +15 -0
  426. package/src/view/use-announcer/index.ts +2 -0
  427. package/src/view/use-announcer/use-announcer.ts +80 -0
  428. package/src/view/use-dev-setup-warning.ts +22 -0
  429. package/src/view/use-dev.ts +9 -0
  430. package/src/view/use-draggable-publisher/get-dimension.ts +44 -0
  431. package/src/view/use-draggable-publisher/index.ts +2 -0
  432. package/src/view/use-draggable-publisher/use-draggable-publisher.ts +87 -0
  433. package/src/view/use-droppable-publisher/check-for-nested-scroll-container.ts +27 -0
  434. package/src/view/use-droppable-publisher/get-closest-scrollable.ts +96 -0
  435. package/src/view/use-droppable-publisher/get-dimension.ts +140 -0
  436. package/src/view/use-droppable-publisher/get-env.ts +32 -0
  437. package/src/view/use-droppable-publisher/get-listener-options.ts +12 -0
  438. package/src/view/use-droppable-publisher/get-scroll.ts +7 -0
  439. package/src/view/use-droppable-publisher/index.ts +2 -0
  440. package/src/view/use-droppable-publisher/is-in-fixed-container.ts +21 -0
  441. package/src/view/use-droppable-publisher/use-droppable-publisher.ts +288 -0
  442. package/src/view/use-focus-marshal/focus-marshal-types.ts +14 -0
  443. package/src/view/use-focus-marshal/index.ts +2 -0
  444. package/src/view/use-focus-marshal/use-focus-marshal.ts +128 -0
  445. package/src/view/use-hidden-text-element/index.ts +2 -0
  446. package/src/view/use-hidden-text-element/use-hidden-text-element.ts +62 -0
  447. package/src/view/use-isomorphic-layout-effect.ts +18 -0
  448. package/src/view/use-previous-ref.ts +26 -0
  449. package/src/view/use-required-context.ts +22 -0
  450. package/src/view/use-sensor-marshal/closest.ts +89 -0
  451. package/src/view/use-sensor-marshal/find-closest-draggable-id-from-event.ts +50 -0
  452. package/src/view/use-sensor-marshal/index.ts +5 -0
  453. package/src/view/use-sensor-marshal/is-event-in-interactive-element.ts +67 -0
  454. package/src/view/use-sensor-marshal/lock.ts +50 -0
  455. package/src/view/use-sensor-marshal/sensors/use-keyboard-sensor.ts +243 -0
  456. package/src/view/use-sensor-marshal/sensors/use-mouse-sensor.ts +391 -0
  457. package/src/view/use-sensor-marshal/sensors/use-touch-sensor.ts +481 -0
  458. package/src/view/use-sensor-marshal/sensors/util/prevent-standard-key-events.ts +19 -0
  459. package/src/view/use-sensor-marshal/sensors/util/supported-page-visibility-event-name.ts +29 -0
  460. package/src/view/use-sensor-marshal/use-sensor-marshal.ts +504 -0
  461. package/src/view/use-sensor-marshal/use-validate-sensor-hooks.ts +20 -0
  462. package/src/view/use-style-marshal/get-styles.ts +173 -0
  463. package/src/view/use-style-marshal/index.ts +2 -0
  464. package/src/view/use-style-marshal/style-marshal-types.ts +9 -0
  465. package/src/view/use-style-marshal/use-style-marshal.ts +126 -0
  466. package/src/view/use-unique-id.ts +25 -0
  467. package/src/view/visually-hidden-style.ts +16 -0
  468. package/src/view/window/get-max-window-scroll.ts +19 -0
  469. package/src/view/window/get-viewport.ts +49 -0
  470. package/src/view/window/get-window-from-el.ts +12 -0
  471. package/src/view/window/get-window-scroll.ts +30 -0
  472. package/src/view/window/scroll-window.ts +7 -0
@@ -0,0 +1,204 @@
1
+ // @flow
2
+ import React, { useState, useRef, useEffect, type ReactNode } from "react";
3
+ import { useCallback } from "@helpdice/memoizer";
4
+ import type { Spacing } from "css-box-model";
5
+ import type {
6
+ Placeholder as PlaceholderType,
7
+ InOutAnimationMode,
8
+ ContextId,
9
+ TimeoutID,
10
+ } from "../../types";
11
+ import { transitions } from "../../animation";
12
+ import { noSpacing } from "../../state/spacing";
13
+
14
+ function noop() {}
15
+
16
+ // Exact
17
+ export type PlaceholderStyle = {
18
+ display: string,
19
+ boxSizing: "border-box",
20
+ width: number,
21
+ height: number,
22
+ marginTop: number,
23
+ marginRight: number,
24
+ marginBottom: number,
25
+ marginLeft: number,
26
+ flexShrink: "0",
27
+ flexGrow: "0",
28
+ pointerEvents: "none",
29
+ transition: string | null,
30
+ };
31
+
32
+ // Exact
33
+ export type Props = {
34
+ placeholder: PlaceholderType,
35
+ animate: InOutAnimationMode,
36
+ onClose: () => void,
37
+ innerRef: (value: HTMLElement | null) => void,
38
+ onTransitionEnd: () => void,
39
+ contextId: ContextId,
40
+ };
41
+
42
+ // Exact
43
+ type Size = {
44
+ width: number,
45
+ height: number,
46
+ // Need to animate in/out animation as well as size
47
+ margin: Spacing,
48
+ };
49
+
50
+ // Exact
51
+ type HelperArgs = {
52
+ isAnimatingOpenOnMount: boolean,
53
+ placeholder: PlaceholderType,
54
+ animate: InOutAnimationMode,
55
+ };
56
+
57
+ const empty: Size = {
58
+ width: 0,
59
+ height: 0,
60
+ margin: noSpacing,
61
+ };
62
+
63
+ const getSize = ({
64
+ isAnimatingOpenOnMount,
65
+ placeholder,
66
+ animate,
67
+ }: HelperArgs): Size => {
68
+ if (isAnimatingOpenOnMount) {
69
+ return empty;
70
+ }
71
+
72
+ if (animate === "close") {
73
+ return empty;
74
+ }
75
+
76
+ return {
77
+ height: placeholder.client.borderBox.height,
78
+ width: placeholder.client.borderBox.width,
79
+ margin: placeholder.client.margin,
80
+ };
81
+ };
82
+
83
+ const getStyle = ({
84
+ isAnimatingOpenOnMount,
85
+ placeholder,
86
+ animate,
87
+ }: HelperArgs): PlaceholderStyle => {
88
+ const size: Size = getSize({ isAnimatingOpenOnMount, placeholder, animate });
89
+
90
+ return {
91
+ display: placeholder.display,
92
+ // ## Recreating the box model
93
+ // We created the borderBox and then apply the margins directly
94
+ // this is to maintain any margin collapsing behaviour
95
+
96
+ // creating borderBox
97
+ // background: 'green',
98
+ boxSizing: "border-box",
99
+ width: size.width,
100
+ height: size.height,
101
+ // creating marginBox
102
+ marginTop: size.margin.top,
103
+ marginRight: size.margin.right,
104
+ marginBottom: size.margin.bottom,
105
+ marginLeft: size.margin.left,
106
+
107
+ // ## Avoiding collapsing
108
+ // Avoiding the collapsing or growing of this element when pushed by flex child siblings.
109
+ // We have already taken a snapshot the current dimensions we do not want this element
110
+ // to recalculate its dimensions
111
+ // It is okay for these properties to be applied on elements that are not flex children
112
+ flexShrink: "0",
113
+ flexGrow: "0",
114
+ // Just a little performance optimisation: avoiding the browser needing
115
+ // to worry about pointer events for this element
116
+ pointerEvents: "none",
117
+
118
+ // Animate the placeholder size and margin
119
+ transition: animate !== "none" ? transitions.placeholder : null,
120
+ };
121
+ };
122
+
123
+ function Placeholder(props: Props): ReactNode {
124
+ const animateOpenTimerRef = useRef<TimeoutID | null>(null);
125
+
126
+ const tryClearAnimateOpenTimer = useCallback(() => {
127
+ if (!animateOpenTimerRef.current) {
128
+ return;
129
+ }
130
+ clearTimeout(animateOpenTimerRef.current);
131
+ animateOpenTimerRef.current = null;
132
+ }, []);
133
+
134
+ const { animate, onTransitionEnd, onClose, contextId } = props;
135
+ const [isAnimatingOpenOnMount, setIsAnimatingOpenOnMount] = useState<boolean>(
136
+ props.animate === "open",
137
+ );
138
+
139
+ // Will run after a render is flushed
140
+ // Still need to wait a timeout to ensure that the
141
+ // update is completely applied to the DOM
142
+ useEffect(() => {
143
+ // No need to do anything
144
+ if (!isAnimatingOpenOnMount) {
145
+ return noop;
146
+ }
147
+
148
+ // might need to clear the timer
149
+ if (animate !== "open") {
150
+ tryClearAnimateOpenTimer();
151
+ setIsAnimatingOpenOnMount(false);
152
+ return noop;
153
+ }
154
+
155
+ // timer already pending
156
+ if (animateOpenTimerRef.current) {
157
+ return noop;
158
+ }
159
+
160
+ animateOpenTimerRef.current = setTimeout(() => {
161
+ animateOpenTimerRef.current = null;
162
+ setIsAnimatingOpenOnMount(false);
163
+ });
164
+
165
+ // clear the timer if needed
166
+ return tryClearAnimateOpenTimer;
167
+ }, [animate, isAnimatingOpenOnMount, tryClearAnimateOpenTimer]);
168
+
169
+ const onSizeChangeEnd = useCallback(
170
+ (event: TransitionEvent) => {
171
+ // We transition height, width and margin
172
+ // each of those transitions will independently call this callback
173
+ // Because they all have the same duration we can just respond to one of them
174
+ // 'height' was chosen for no particular reason :D
175
+ if (event.propertyName !== "height") {
176
+ return;
177
+ }
178
+
179
+ onTransitionEnd();
180
+
181
+ if (animate === "close") {
182
+ onClose();
183
+ }
184
+ },
185
+ [animate, onClose, onTransitionEnd],
186
+ );
187
+
188
+ const style: PlaceholderStyle = getStyle({
189
+ isAnimatingOpenOnMount,
190
+ animate: props.animate,
191
+ placeholder: props.placeholder,
192
+ });
193
+
194
+ return React.createElement(props.placeholder.tagName, {
195
+ style,
196
+ "data-rbd-placeholder-context-id": contextId,
197
+ onTransitionEnd: onSizeChangeEnd,
198
+ ref: props.innerRef,
199
+ });
200
+ }
201
+
202
+ export default React.memo<Props>(Placeholder);
203
+ // enzyme does not work well with memo, so exporting the non-memo version
204
+ export const WithoutMemo = Placeholder;
@@ -0,0 +1,74 @@
1
+ // @flow
2
+ import type { Position } from 'css-box-model';
3
+ import rafSchd from 'raf-schd';
4
+ import { invariant } from '../invariant';
5
+ import bindEvents from './event-bindings/bind-events';
6
+ import type { EventBinding } from './event-bindings/event-types';
7
+ import getWindowScroll from './window/get-window-scroll';
8
+ import { noop } from '../empty';
9
+
10
+ type OnWindowScroll = (newScroll: Position) => void;
11
+
12
+ // Exact
13
+ type Args = {
14
+ onWindowScroll: OnWindowScroll,
15
+ };
16
+
17
+ // Exact
18
+ type Result = {
19
+ start: () => void,
20
+ stop: () => void,
21
+ isActive: () => boolean,
22
+ };
23
+
24
+ function getWindowScrollBinding(update: () => void): EventBinding {
25
+ return {
26
+ eventName: 'scroll',
27
+ // ## Passive: true
28
+ // Eventual consistency is fine because we use position: fixed on the item
29
+ // ## Capture: false
30
+ // Scroll events on elements do not bubble, but they go through the capture phase
31
+ // https://twitter.com/alexandereardon/status/985994224867819520
32
+ // Using capture: false here as we want to avoid intercepting droppable scroll requests
33
+ options: { passive: true, capture: false },
34
+ fn: (event: UIEvent) => {
35
+ // IE11 fix
36
+ // All scrollable events still bubble up and are caught by this handler in ie11.
37
+ // On a window scroll the event.target should be the window or the document.
38
+ // If this is not the case then it is not a 'window' scroll event and can be ignored
39
+ if (event.target !== window && event.target !== window.document) {
40
+ return;
41
+ }
42
+
43
+ update();
44
+ },
45
+ };
46
+ }
47
+
48
+ export default function getScrollListener({ onWindowScroll }: Args): Result {
49
+ function updateScroll() {
50
+ // letting the update function read the latest scroll when called
51
+ onWindowScroll(getWindowScroll());
52
+ }
53
+
54
+ const scheduled = rafSchd(updateScroll);
55
+ const binding: EventBinding = getWindowScrollBinding(scheduled);
56
+ let unbind: () => void = noop;
57
+
58
+ function isActive(): boolean {
59
+ return unbind !== noop;
60
+ }
61
+
62
+ function start() {
63
+ invariant(!isActive(), 'Cannot start scroll listener when already active');
64
+ unbind = bindEvents(window, [binding], {});
65
+ }
66
+ function stop() {
67
+ invariant(isActive(), 'Cannot stop scroll listener when not active');
68
+ scheduled.cancel();
69
+ unbind();
70
+ unbind = noop;
71
+ }
72
+
73
+ return { start, stop, isActive };
74
+ }
@@ -0,0 +1,15 @@
1
+ // @flow
2
+ import { invariant } from '../invariant';
3
+ import isHtmlElement from './is-type-of-element/is-html-element';
4
+
5
+ export default (ref: unknown | null) => {
6
+ invariant(
7
+ ref && isHtmlElement(ref as Element),
8
+ `
9
+ provided.innerRef has not been provided with a HTMLElement.
10
+
11
+ You can find a guide on using the innerRef callback functions at:
12
+ https://github.com/atlassian/react-beautiful-dnd/blob/master/docs/guides/using-inner-ref.md
13
+ `,
14
+ );
15
+ };
@@ -0,0 +1,2 @@
1
+ // @flow
2
+ export { default } from './use-announcer';
@@ -0,0 +1,80 @@
1
+ // @flow
2
+ import { useRef, useEffect } from "react";
3
+ import { useMemo, useCallback } from "@helpdice/memoizer";
4
+ import type { Announce, ContextId } from "../../types";
5
+ import { warning } from "../../dev-warning";
6
+ import getBodyElement from "../get-body-element";
7
+ import visuallyHidden from "../visually-hidden-style";
8
+
9
+ export const getId = (contextId: ContextId): string =>
10
+ `rbd-announcement-${contextId}`;
11
+
12
+ export default function useAnnouncer(contextId: ContextId): Announce {
13
+ const id: string = useMemo(() => getId(contextId), [contextId]);
14
+ const ref = useRef<HTMLElement | null>(null);
15
+
16
+ useEffect(
17
+ function setup() {
18
+ const el: HTMLElement = document.createElement("div");
19
+ // storing reference for usage in announce
20
+ ref.current = el;
21
+
22
+ // identifier
23
+ el.id = id;
24
+
25
+ // Aria live region
26
+
27
+ // will force itself to be read
28
+ el.setAttribute("aria-live", "assertive");
29
+ // must read the whole thing every time
30
+ el.setAttribute("aria-atomic", "true");
31
+
32
+ // hide the element visually
33
+ Object.assign(el.style, visuallyHidden);
34
+
35
+ // Add to body
36
+ getBodyElement().appendChild(el);
37
+
38
+ return function cleanup() {
39
+ // Not clearing the ref as it might be used by announce before the timeout expires
40
+
41
+ // unmounting after a timeout to let any announcements
42
+ // during a mount be published
43
+ setTimeout(function remove() {
44
+ // checking if element exists as the body might have been changed by things like 'turbolinks'
45
+ const body: HTMLElement = getBodyElement(); // HTMLBodyElement
46
+ if (body.contains(el)) {
47
+ body.removeChild(el);
48
+ }
49
+ // if el was the current ref - clear it so that
50
+ // we can get a warning if announce is called
51
+ if (el === ref.current) {
52
+ ref.current = null;
53
+ }
54
+ });
55
+ };
56
+ },
57
+ [id],
58
+ );
59
+
60
+ const announce: Announce = useCallback((message: string): void => {
61
+ const el: HTMLElement | null = ref.current;
62
+ if (el) {
63
+ el.textContent = message;
64
+ return;
65
+ }
66
+
67
+ warning(`
68
+ A screen reader message was trying to be announced but it was unable to do so.
69
+ This can occur if you unmount your <DragDropContext /> in your onDragEnd.
70
+ Consider calling provided.announce() before the unmount so that the instruction will
71
+ not be lost for users relying on a screen reader.
72
+
73
+ Message not passed to screen reader:
74
+
75
+ "${message}"
76
+ `);
77
+ }, []);
78
+
79
+ return announce;
80
+ }
@@ -0,0 +1,22 @@
1
+ // @flow
2
+ import { useEffect } from 'react';
3
+ import { error } from '../dev-warning';
4
+ import useDev from './use-dev';
5
+
6
+ export default function useDevSetupWarning(fn: () => void, inputs?: unknown[]) {
7
+ useDev(() => {
8
+ // eslint-disable-next-line react-hooks/rules-of-hooks
9
+ useEffect(() => {
10
+ try {
11
+ fn();
12
+ } catch (e) {
13
+ error(`
14
+ A setup problem was encountered.
15
+
16
+ > ${e.message}
17
+ `);
18
+ }
19
+ // eslint-disable-next-line react-hooks/exhaustive-deps
20
+ }, inputs);
21
+ });
22
+ }
@@ -0,0 +1,9 @@
1
+ // @flow
2
+
3
+ export default function useDev(useHook: () => void) {
4
+ // Don't run any validation in production
5
+ if (process.env.NODE_ENV !== 'production') {
6
+ // eslint-disable-next-line react-hooks/rules-of-hooks
7
+ useHook();
8
+ }
9
+ }
@@ -0,0 +1,44 @@
1
+ // @flow
2
+ import {
3
+ type BoxModel,
4
+ type Position,
5
+ calculateBox,
6
+ withScroll,
7
+ } from 'css-box-model';
8
+ import type {
9
+ DraggableDescriptor,
10
+ DraggableDimension,
11
+ Placeholder,
12
+ } from '../../types';
13
+ import { origin } from '../../state/position';
14
+
15
+ export default function getDimension(
16
+ descriptor: DraggableDescriptor,
17
+ el: HTMLElement,
18
+ windowScroll: Position = origin,
19
+ ): DraggableDimension {
20
+ const computedStyles: CSSStyleDeclaration = window.getComputedStyle(el);
21
+ const borderBox: ClientRect = el.getBoundingClientRect();
22
+ const client: BoxModel = calculateBox(borderBox, computedStyles);
23
+ const page: BoxModel = withScroll(client, windowScroll);
24
+
25
+ const placeholder: Placeholder = {
26
+ client,
27
+ tagName: el.tagName.toLowerCase(),
28
+ display: computedStyles.display,
29
+ };
30
+ const displaceBy: Position = {
31
+ x: client.marginBox.width,
32
+ y: client.marginBox.height,
33
+ };
34
+
35
+ const dimension: DraggableDimension = {
36
+ descriptor,
37
+ placeholder,
38
+ displaceBy,
39
+ client,
40
+ page,
41
+ };
42
+
43
+ return dimension;
44
+ }
@@ -0,0 +1,2 @@
1
+ // @flow
2
+ export { default } from './use-draggable-publisher';
@@ -0,0 +1,87 @@
1
+ // @flow
2
+ import { type Position } from "css-box-model";
3
+ import { useMemo, useCallback } from "@helpdice/memoizer";
4
+ import { useRef } from "react";
5
+ import { invariant } from "../../invariant";
6
+ import type {
7
+ DraggableDescriptor,
8
+ DraggableDimension,
9
+ Id,
10
+ DraggableOptions,
11
+ } from "../../types";
12
+ import type {
13
+ Registry,
14
+ DraggableEntry,
15
+ } from "../../state/registry/registry-types";
16
+ import makeDimension from "./get-dimension";
17
+ import useLayoutEffect from "../use-isomorphic-layout-effect";
18
+ import useUniqueId from "../use-unique-id";
19
+
20
+ // Exact
21
+ export type Args = {
22
+ descriptor: DraggableDescriptor,
23
+ getDraggableRef: () => HTMLElement | null,
24
+ registry: Registry,
25
+ } & DraggableOptions;
26
+
27
+ export default function useDraggablePublisher(args: Args) {
28
+ const uniqueId: Id = useUniqueId("draggable");
29
+
30
+ const {
31
+ descriptor,
32
+ registry,
33
+ getDraggableRef,
34
+ canDragInteractiveElements,
35
+ shouldRespectForcePress,
36
+ isEnabled,
37
+ } = args;
38
+
39
+ const options: DraggableOptions = useMemo(
40
+ () => ({
41
+ canDragInteractiveElements,
42
+ shouldRespectForcePress,
43
+ isEnabled,
44
+ }),
45
+ [canDragInteractiveElements, isEnabled, shouldRespectForcePress],
46
+ );
47
+
48
+ const getDimension = useCallback(
49
+ (windowScroll?: Position): DraggableDimension => {
50
+ const el: HTMLElement | null = getDraggableRef();
51
+ invariant(el, "Cannot get dimension when no ref is set");
52
+ return makeDimension(descriptor, el, windowScroll);
53
+ },
54
+ [descriptor, getDraggableRef],
55
+ );
56
+
57
+ const entry: DraggableEntry = useMemo(
58
+ () => ({
59
+ uniqueId,
60
+ descriptor,
61
+ options,
62
+ getDimension,
63
+ }),
64
+ [descriptor, getDimension, options, uniqueId],
65
+ );
66
+
67
+ const publishedRef = useRef<DraggableEntry>(entry);
68
+ const isFirstPublishRef = useRef<boolean>(true);
69
+
70
+ // mounting and unmounting
71
+ useLayoutEffect(() => {
72
+ registry.draggable.register(publishedRef.current);
73
+ return () => registry.draggable.unregister(publishedRef.current);
74
+ }, [registry.draggable]);
75
+
76
+ // updates while mounted
77
+ useLayoutEffect(() => {
78
+ if (isFirstPublishRef.current) {
79
+ isFirstPublishRef.current = false;
80
+ return;
81
+ }
82
+
83
+ const last: DraggableEntry = publishedRef.current;
84
+ publishedRef.current = entry;
85
+ registry.draggable.update(entry, last);
86
+ }, [entry, registry.draggable]);
87
+ }
@@ -0,0 +1,27 @@
1
+ // @flow
2
+ import getClosestScrollable from './get-closest-scrollable';
3
+ import { warning } from '../../dev-warning';
4
+
5
+ // We currently do not support nested scroll containers
6
+ // But will hopefully support this soon!
7
+ export default (scrollable: Element | null) => {
8
+ if (!scrollable) {
9
+ return;
10
+ }
11
+
12
+ const anotherScrollParent: Element | null = getClosestScrollable(
13
+ scrollable.parentElement,
14
+ );
15
+
16
+ if (!anotherScrollParent) {
17
+ return;
18
+ }
19
+
20
+ warning(`
21
+ Droppable: unsupported nested scroll container detected.
22
+ A Droppable can only have one scroll parent (which can be itself)
23
+ Nested scroll containers are currently not supported.
24
+
25
+ We hope to support nested scroll containers soon: https://github.com/atlassian/react-beautiful-dnd/issues/131
26
+ `);
27
+ };
@@ -0,0 +1,96 @@
1
+ // @flow
2
+ import { invariant } from '../../invariant';
3
+ import { warning } from '../../dev-warning';
4
+ import getBodyElement from '../get-body-element';
5
+
6
+ // Exact
7
+ type Overflow = {
8
+ overflowX: string,
9
+ overflowY: string,
10
+ };
11
+
12
+ const isEqual = (base: string) => (value: string): boolean => base === value;
13
+ const isScroll = isEqual('scroll');
14
+ const isAuto = isEqual('auto');
15
+ const isVisible = isEqual('visible');
16
+ const isEither = (overflow: Overflow, fn: (value: string) => boolean) =>
17
+ fn(overflow.overflowX) || fn(overflow.overflowY);
18
+ const isBoth = (overflow: Overflow, fn: (value: string) => boolean) =>
19
+ fn(overflow.overflowX) && fn(overflow.overflowY);
20
+
21
+ const isElementScrollable = (el: Element): boolean => {
22
+ const style: CSSStyleDeclaration = window.getComputedStyle(el);
23
+ const overflow: Overflow = {
24
+ overflowX: style.overflowX,
25
+ overflowY: style.overflowY,
26
+ };
27
+
28
+ return isEither(overflow, isScroll) || isEither(overflow, isAuto);
29
+ };
30
+
31
+ // Special case for a body element
32
+ // Playground: https://codepen.io/alexreardon/pen/ZmyLgX?editors=1111
33
+ const isBodyScrollable = (): boolean => {
34
+ // Because we always return false for now, we can skip any actual processing in production
35
+ if (process.env.NODE_ENV === 'production') {
36
+ return false;
37
+ }
38
+
39
+ const body: HTMLElement = getBodyElement(); // HTMLBodyElement
40
+ const html: HTMLElement | null = document.documentElement;
41
+ invariant(html);
42
+
43
+ // 1. The `body` has `overflow-[x|y]: auto | scroll`
44
+ if (!isElementScrollable(body)) {
45
+ return false;
46
+ }
47
+
48
+ const htmlStyle: CSSStyleDeclaration = window.getComputedStyle(html);
49
+ const htmlOverflow: Overflow = {
50
+ overflowX: htmlStyle.overflowX,
51
+ overflowY: htmlStyle.overflowY,
52
+ };
53
+
54
+ if (isBoth(htmlOverflow, isVisible)) {
55
+ return false;
56
+ }
57
+
58
+ warning(`
59
+ We have detected that your <body> element might be a scroll container.
60
+ We have found no reliable way of detecting whether the <body> element is a scroll container.
61
+ Under most circumstances a <body> scroll bar will be on the <html> element (document.documentElement)
62
+
63
+ Because we cannot determine if the <body> is a scroll container, and generally it is not one,
64
+ we will be treating the <body> as *not* a scroll container
65
+
66
+ More information: https://github.com/atlassian/react-beautiful-dnd/blob/master/docs/guides/how-we-detect-scroll-containers.md
67
+ `);
68
+ return false;
69
+ };
70
+
71
+ const getClosestScrollable = (el: Element | null): Element | null => {
72
+ // cannot do anything else!
73
+ if (el == null) {
74
+ return null;
75
+ }
76
+
77
+ // not allowing us to go higher then body
78
+ if (el === document.body) {
79
+ return isBodyScrollable() ? el : null;
80
+ }
81
+
82
+ // Should never get here, but just being safe
83
+ if (el === document.documentElement) {
84
+ return null;
85
+ }
86
+
87
+ if (!isElementScrollable(el)) {
88
+ // keep recursing
89
+ return getClosestScrollable(el.parentElement);
90
+ }
91
+
92
+ // success!
93
+ return el;
94
+ };
95
+
96
+ export default getClosestScrollable;