@planningcenter/react-beautiful-dnd 13.2.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 (243) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/LICENSE +13 -0
  3. package/README.md +178 -0
  4. package/dist/react-beautiful-dnd.cjs.js +8728 -0
  5. package/dist/react-beautiful-dnd.cjs.js.flow +3 -0
  6. package/dist/react-beautiful-dnd.esm.js +8715 -0
  7. package/dist/react-beautiful-dnd.js +11726 -0
  8. package/dist/react-beautiful-dnd.min.js +1 -0
  9. package/package.json +155 -0
  10. package/src/animation.js +75 -0
  11. package/src/debug/middleware/action-timing-average.js +52 -0
  12. package/src/debug/middleware/action-timing.js +16 -0
  13. package/src/debug/middleware/log.js +26 -0
  14. package/src/debug/middleware/user-timing.js +16 -0
  15. package/src/debug/timings.js +86 -0
  16. package/src/dev-warning.js +50 -0
  17. package/src/empty.js +6 -0
  18. package/src/index.js +67 -0
  19. package/src/invariant.js +33 -0
  20. package/src/native-with-fallback.js +69 -0
  21. package/src/screen-reader-message-preset.js +134 -0
  22. package/src/state/action-creators.js +328 -0
  23. package/src/state/auto-scroller/auto-scroller-types.js +8 -0
  24. package/src/state/auto-scroller/can-scroll.js +160 -0
  25. package/src/state/auto-scroller/fluid-scroller/config.js +25 -0
  26. package/src/state/auto-scroller/fluid-scroller/did-start-in-scrollable-area.js +1 -0
  27. package/src/state/auto-scroller/fluid-scroller/get-best-scrollable-droppable.js +77 -0
  28. package/src/state/auto-scroller/fluid-scroller/get-droppable-scroll-change.js +50 -0
  29. package/src/state/auto-scroller/fluid-scroller/get-percentage.js +25 -0
  30. package/src/state/auto-scroller/fluid-scroller/get-scroll/adjust-for-size-limits.js +30 -0
  31. package/src/state/auto-scroller/fluid-scroller/get-scroll/buffer-thresholds/calc-axis-scroll-conditions.js +68 -0
  32. package/src/state/auto-scroller/fluid-scroller/get-scroll/buffer-thresholds/get-scroll-conditions.js +56 -0
  33. package/src/state/auto-scroller/fluid-scroller/get-scroll/buffer-thresholds/index.js +66 -0
  34. package/src/state/auto-scroller/fluid-scroller/get-scroll/get-scroll-on-axis/dampen-value-by-time.js +48 -0
  35. package/src/state/auto-scroller/fluid-scroller/get-scroll/get-scroll-on-axis/get-distance-thresholds.js +31 -0
  36. package/src/state/auto-scroller/fluid-scroller/get-scroll/get-scroll-on-axis/get-value-from-distance.js +67 -0
  37. package/src/state/auto-scroller/fluid-scroller/get-scroll/get-scroll-on-axis/get-value.js +51 -0
  38. package/src/state/auto-scroller/fluid-scroller/get-scroll/get-scroll-on-axis/index.js +50 -0
  39. package/src/state/auto-scroller/fluid-scroller/get-scroll/get-scroll-on-axis/min-scroll.js +4 -0
  40. package/src/state/auto-scroller/fluid-scroller/get-scroll/index.js +139 -0
  41. package/src/state/auto-scroller/fluid-scroller/get-window-scroll-change.js +43 -0
  42. package/src/state/auto-scroller/fluid-scroller/index.js +99 -0
  43. package/src/state/auto-scroller/fluid-scroller/scroll.js +80 -0
  44. package/src/state/auto-scroller/index.js +59 -0
  45. package/src/state/auto-scroller/jump-scroller.js +139 -0
  46. package/src/state/axis.js +26 -0
  47. package/src/state/calculate-drag-impact/calculate-reorder-impact.js +136 -0
  48. package/src/state/can-start-drag.js +29 -0
  49. package/src/state/create-store.js +97 -0
  50. package/src/state/did-start-after-critical.js +9 -0
  51. package/src/state/dimension-marshal/dimension-marshal-types.js +46 -0
  52. package/src/state/dimension-marshal/dimension-marshal.js +218 -0
  53. package/src/state/dimension-marshal/get-initial-publish.js +66 -0
  54. package/src/state/dimension-marshal/while-dragging-publisher.js +146 -0
  55. package/src/state/dimension-structures.js +35 -0
  56. package/src/state/droppable/get-droppable.js +101 -0
  57. package/src/state/droppable/is-home-of.js +7 -0
  58. package/src/state/droppable/scroll-droppable.js +53 -0
  59. package/src/state/droppable/should-use-placeholder.js +7 -0
  60. package/src/state/droppable/util/clip.js +17 -0
  61. package/src/state/droppable/util/get-subject.js +63 -0
  62. package/src/state/droppable/what-is-dragged-over-from-result.js +16 -0
  63. package/src/state/droppable/what-is-dragged-over.js +16 -0
  64. package/src/state/droppable/with-placeholder.js +174 -0
  65. package/src/state/get-center-from-impact/get-client-border-box-center/get-client-from-page-border-box-center.js +29 -0
  66. package/src/state/get-center-from-impact/get-client-border-box-center/index.js +44 -0
  67. package/src/state/get-center-from-impact/get-page-border-box-center/index.js +70 -0
  68. package/src/state/get-center-from-impact/get-page-border-box-center/when-combining.js +39 -0
  69. package/src/state/get-center-from-impact/get-page-border-box-center/when-reordering.js +112 -0
  70. package/src/state/get-center-from-impact/move-relative-to.js +66 -0
  71. package/src/state/get-combined-item-displacement.js +34 -0
  72. package/src/state/get-displaced-by.js +17 -0
  73. package/src/state/get-displacement-groups.js +130 -0
  74. package/src/state/get-drag-impact/get-combine-impact.js +130 -0
  75. package/src/state/get-drag-impact/get-reorder-impact.js +143 -0
  76. package/src/state/get-drag-impact/index.js +93 -0
  77. package/src/state/get-draggables-inside-droppable.js +31 -0
  78. package/src/state/get-droppable-over.js +158 -0
  79. package/src/state/get-frame.js +10 -0
  80. package/src/state/get-home-location.js +7 -0
  81. package/src/state/get-impact-location.js +16 -0
  82. package/src/state/get-is-displaced.js +11 -0
  83. package/src/state/get-lift-effect.js +82 -0
  84. package/src/state/get-max-scroll.js +30 -0
  85. package/src/state/is-movement-allowed.js +6 -0
  86. package/src/state/is-within.js +9 -0
  87. package/src/state/middleware/auto-scroll.js +38 -0
  88. package/src/state/middleware/dimension-marshal-stopper.js +20 -0
  89. package/src/state/middleware/drop/drop-animation-finish-middleware.js +21 -0
  90. package/src/state/middleware/drop/drop-animation-flush-on-scroll-middleware.js +63 -0
  91. package/src/state/middleware/drop/drop-middleware.js +146 -0
  92. package/src/state/middleware/drop/get-drop-duration.js +47 -0
  93. package/src/state/middleware/drop/get-drop-impact.js +77 -0
  94. package/src/state/middleware/drop/get-new-home-client-offset.js +54 -0
  95. package/src/state/middleware/drop/index.js +2 -0
  96. package/src/state/middleware/focus.js +42 -0
  97. package/src/state/middleware/lift.js +66 -0
  98. package/src/state/middleware/pending-drop.js +37 -0
  99. package/src/state/middleware/responders/async-marshal.js +55 -0
  100. package/src/state/middleware/responders/expiring-announce.js +44 -0
  101. package/src/state/middleware/responders/index.js +2 -0
  102. package/src/state/middleware/responders/is-equal.js +57 -0
  103. package/src/state/middleware/responders/publisher.js +253 -0
  104. package/src/state/middleware/responders/responders-middleware.js +75 -0
  105. package/src/state/middleware/scroll-listener.js +31 -0
  106. package/src/state/middleware/style.js +22 -0
  107. package/src/state/middleware/util/validate-dimensions.js +71 -0
  108. package/src/state/move-in-direction/index.js +84 -0
  109. package/src/state/move-in-direction/move-cross-axis/get-best-cross-axis-droppable.js +168 -0
  110. package/src/state/move-in-direction/move-cross-axis/get-closest-draggable.js +79 -0
  111. package/src/state/move-in-direction/move-cross-axis/index.js +109 -0
  112. package/src/state/move-in-direction/move-cross-axis/move-to-new-droppable.js +121 -0
  113. package/src/state/move-in-direction/move-cross-axis/without-starting-displacement.js +31 -0
  114. package/src/state/move-in-direction/move-in-direction-types.js +9 -0
  115. package/src/state/move-in-direction/move-to-next-place/index.js +132 -0
  116. package/src/state/move-in-direction/move-to-next-place/is-totally-visible-in-new-location.js +52 -0
  117. package/src/state/move-in-direction/move-to-next-place/move-to-next-combine/index.js +97 -0
  118. package/src/state/move-in-direction/move-to-next-place/move-to-next-index/from-combine.js +52 -0
  119. package/src/state/move-in-direction/move-to-next-place/move-to-next-index/from-reorder.js +43 -0
  120. package/src/state/move-in-direction/move-to-next-place/move-to-next-index/index.js +86 -0
  121. package/src/state/no-impact.js +33 -0
  122. package/src/state/patch-dimension-map.js +11 -0
  123. package/src/state/patch-droppable-map.js +10 -0
  124. package/src/state/position.js +58 -0
  125. package/src/state/post-reducer/when-moving/refresh-snap.js +67 -0
  126. package/src/state/post-reducer/when-moving/update.js +120 -0
  127. package/src/state/publish-while-dragging-in-virtual/adjust-additions-for-scroll-changes.js +58 -0
  128. package/src/state/publish-while-dragging-in-virtual/index.js +158 -0
  129. package/src/state/publish-while-dragging-in-virtual/offset-draggable.js +35 -0
  130. package/src/state/recompute-placeholders.js +99 -0
  131. package/src/state/rect.js +7 -0
  132. package/src/state/reducer.js +457 -0
  133. package/src/state/registry/create-registry.js +162 -0
  134. package/src/state/registry/registry-types.js +98 -0
  135. package/src/state/registry/use-registry.js +20 -0
  136. package/src/state/remove-draggable-from-list.js +13 -0
  137. package/src/state/scroll-viewport.js +34 -0
  138. package/src/state/spacing.js +45 -0
  139. package/src/state/store-types.js +16 -0
  140. package/src/state/update-displacement-visibility/recompute.js +54 -0
  141. package/src/state/update-displacement-visibility/speculatively-increase.js +111 -0
  142. package/src/state/visibility/is-partially-visible-through-frame.js +60 -0
  143. package/src/state/visibility/is-position-in-frame.js +12 -0
  144. package/src/state/visibility/is-totally-visible-through-frame-on-axis.js +19 -0
  145. package/src/state/visibility/is-totally-visible-through-frame.js +18 -0
  146. package/src/state/visibility/is-visible.js +102 -0
  147. package/src/state/with-scroll-change/with-all-displacement.js +15 -0
  148. package/src/state/with-scroll-change/with-droppable-displacement.js +13 -0
  149. package/src/state/with-scroll-change/with-droppable-scroll.js +13 -0
  150. package/src/state/with-scroll-change/with-viewport-displacement.js +7 -0
  151. package/src/types.js +542 -0
  152. package/src/view/animate-in-out/animate-in-out.jsx +95 -0
  153. package/src/view/animate-in-out/index.js +2 -0
  154. package/src/view/check-is-valid-inner-ref.js +15 -0
  155. package/src/view/context/app-context.js +19 -0
  156. package/src/view/context/droppable-context.js +11 -0
  157. package/src/view/context/store-context.js +5 -0
  158. package/src/view/data-attributes.js +37 -0
  159. package/src/view/drag-drop-context/app.jsx +273 -0
  160. package/src/view/drag-drop-context/check-doctype.js +39 -0
  161. package/src/view/drag-drop-context/check-react-version.js +71 -0
  162. package/src/view/drag-drop-context/drag-drop-context-types.js +7 -0
  163. package/src/view/drag-drop-context/drag-drop-context.jsx +68 -0
  164. package/src/view/drag-drop-context/error-boundary.jsx +88 -0
  165. package/src/view/drag-drop-context/index.js +2 -0
  166. package/src/view/drag-drop-context/use-startup-validation.js +13 -0
  167. package/src/view/drag-drop-context/use-unique-context-id.js +13 -0
  168. package/src/view/draggable/connected-draggable.js +372 -0
  169. package/src/view/draggable/draggable-api.jsx +48 -0
  170. package/src/view/draggable/draggable-types.js +191 -0
  171. package/src/view/draggable/draggable.jsx +171 -0
  172. package/src/view/draggable/get-style.js +109 -0
  173. package/src/view/draggable/index.js +2 -0
  174. package/src/view/draggable/use-validation.js +70 -0
  175. package/src/view/droppable/connected-droppable.js +280 -0
  176. package/src/view/droppable/droppable-types.js +91 -0
  177. package/src/view/droppable/droppable.jsx +167 -0
  178. package/src/view/droppable/index.js +2 -0
  179. package/src/view/droppable/use-validation.js +101 -0
  180. package/src/view/event-bindings/bind-events.js +39 -0
  181. package/src/view/event-bindings/event-types.js +14 -0
  182. package/src/view/get-body-element.js +8 -0
  183. package/src/view/get-border-box-center-position.js +5 -0
  184. package/src/view/get-document-element.js +8 -0
  185. package/src/view/get-elements/find-drag-handle.js +38 -0
  186. package/src/view/get-elements/find-draggable.js +30 -0
  187. package/src/view/is-strict-equal.js +2 -0
  188. package/src/view/is-type-of-element/is-element.js +6 -0
  189. package/src/view/is-type-of-element/is-html-element.js +6 -0
  190. package/src/view/is-type-of-element/is-svg-element.js +12 -0
  191. package/src/view/key-codes.js +13 -0
  192. package/src/view/placeholder/index.js +2 -0
  193. package/src/view/placeholder/placeholder-types.js +16 -0
  194. package/src/view/placeholder/placeholder.jsx +198 -0
  195. package/src/view/scroll-listener.js +72 -0
  196. package/src/view/throw-if-invalid-inner-ref.js +15 -0
  197. package/src/view/use-announcer/index.js +2 -0
  198. package/src/view/use-announcer/use-announcer.js +80 -0
  199. package/src/view/use-dev-setup-warning.js +22 -0
  200. package/src/view/use-dev.js +9 -0
  201. package/src/view/use-draggable-publisher/get-dimension.js +44 -0
  202. package/src/view/use-draggable-publisher/index.js +2 -0
  203. package/src/view/use-draggable-publisher/use-draggable-publisher.js +87 -0
  204. package/src/view/use-droppable-publisher/check-for-nested-scroll-container.js +27 -0
  205. package/src/view/use-droppable-publisher/get-closest-scrollable.js +95 -0
  206. package/src/view/use-droppable-publisher/get-dimension.js +139 -0
  207. package/src/view/use-droppable-publisher/get-env.js +31 -0
  208. package/src/view/use-droppable-publisher/get-listener-options.js +12 -0
  209. package/src/view/use-droppable-publisher/get-scroll.js +7 -0
  210. package/src/view/use-droppable-publisher/index.js +2 -0
  211. package/src/view/use-droppable-publisher/is-in-fixed-container.js +21 -0
  212. package/src/view/use-droppable-publisher/use-droppable-publisher.js +283 -0
  213. package/src/view/use-focus-marshal/focus-marshal-types.js +13 -0
  214. package/src/view/use-focus-marshal/index.js +2 -0
  215. package/src/view/use-focus-marshal/use-focus-marshal.js +129 -0
  216. package/src/view/use-hidden-text-element/index.js +2 -0
  217. package/src/view/use-hidden-text-element/use-hidden-text-element.js +60 -0
  218. package/src/view/use-isomorphic-layout-effect.js +18 -0
  219. package/src/view/use-previous-ref.js +14 -0
  220. package/src/view/use-required-context.js +9 -0
  221. package/src/view/use-sensor-marshal/closest.js +50 -0
  222. package/src/view/use-sensor-marshal/find-closest-draggable-id-from-event.js +50 -0
  223. package/src/view/use-sensor-marshal/index.js +5 -0
  224. package/src/view/use-sensor-marshal/is-event-in-interactive-element.js +66 -0
  225. package/src/view/use-sensor-marshal/lock.js +48 -0
  226. package/src/view/use-sensor-marshal/sensors/use-keyboard-sensor.js +243 -0
  227. package/src/view/use-sensor-marshal/sensors/use-mouse-sensor.js +386 -0
  228. package/src/view/use-sensor-marshal/sensors/use-touch-sensor.js +461 -0
  229. package/src/view/use-sensor-marshal/sensors/util/prevent-standard-key-events.js +19 -0
  230. package/src/view/use-sensor-marshal/sensors/util/supported-page-visibility-event-name.js +29 -0
  231. package/src/view/use-sensor-marshal/use-sensor-marshal.js +495 -0
  232. package/src/view/use-sensor-marshal/use-validate-sensor-hooks.js +20 -0
  233. package/src/view/use-style-marshal/get-styles.js +170 -0
  234. package/src/view/use-style-marshal/index.js +2 -0
  235. package/src/view/use-style-marshal/style-marshal-types.js +8 -0
  236. package/src/view/use-style-marshal/use-style-marshal.js +126 -0
  237. package/src/view/use-unique-id.js +25 -0
  238. package/src/view/visually-hidden-style.js +16 -0
  239. package/src/view/window/get-max-window-scroll.js +19 -0
  240. package/src/view/window/get-viewport.js +49 -0
  241. package/src/view/window/get-window-from-el.js +3 -0
  242. package/src/view/window/get-window-scroll.js +30 -0
  243. package/src/view/window/scroll-window.js +7 -0
@@ -0,0 +1,126 @@
1
+ // @flow
2
+ import { useRef } from 'react';
3
+ import memoizeOne from 'memoize-one';
4
+ import { useMemo, useCallback } from 'use-memo-one';
5
+ import { invariant } from '../../invariant';
6
+ import type { StyleMarshal } from './style-marshal-types';
7
+ import type { ContextId, DropReason } from '../../types';
8
+ import getStyles, { type Styles } from './get-styles';
9
+ import { prefix } from '../data-attributes';
10
+ import useLayoutEffect from '../use-isomorphic-layout-effect';
11
+
12
+ const getHead = (): HTMLHeadElement => {
13
+ const head: ?HTMLHeadElement = document.querySelector('head');
14
+ invariant(head, 'Cannot find the head to append a style to');
15
+ return head;
16
+ };
17
+
18
+ const createStyleEl = (nonce?: string): HTMLStyleElement => {
19
+ const el: HTMLStyleElement = document.createElement('style');
20
+ if (nonce) {
21
+ el.setAttribute('nonce', nonce);
22
+ }
23
+ el.type = 'text/css';
24
+ return el;
25
+ };
26
+
27
+ export default function useStyleMarshal(contextId: ContextId, nonce?: string) {
28
+ const styles: Styles = useMemo(() => getStyles(contextId), [contextId]);
29
+ const alwaysRef = useRef<?HTMLStyleElement>(null);
30
+ const dynamicRef = useRef<?HTMLStyleElement>(null);
31
+
32
+ const setDynamicStyle = useCallback(
33
+ // Using memoizeOne to prevent frequent updates to textContext
34
+ memoizeOne((proposed: string) => {
35
+ const el: ?HTMLStyleElement = dynamicRef.current;
36
+ invariant(el, 'Cannot set dynamic style element if it is not set');
37
+ el.textContent = proposed;
38
+ }),
39
+ [],
40
+ );
41
+
42
+ const setAlwaysStyle = useCallback((proposed: string) => {
43
+ const el: ?HTMLStyleElement = alwaysRef.current;
44
+ invariant(el, 'Cannot set dynamic style element if it is not set');
45
+ el.textContent = proposed;
46
+ }, []);
47
+
48
+ // using layout effect as programatic dragging might start straight away (such as for cypress)
49
+ useLayoutEffect(() => {
50
+ invariant(
51
+ !alwaysRef.current && !dynamicRef.current,
52
+ 'style elements already mounted',
53
+ );
54
+
55
+ const always: HTMLStyleElement = createStyleEl(nonce);
56
+ const dynamic: HTMLStyleElement = createStyleEl(nonce);
57
+
58
+ // store their refs
59
+ alwaysRef.current = always;
60
+ dynamicRef.current = dynamic;
61
+
62
+ // for easy identification
63
+ always.setAttribute(`${prefix}-always`, contextId);
64
+ dynamic.setAttribute(`${prefix}-dynamic`, contextId);
65
+
66
+ // add style tags to head
67
+ getHead().appendChild(always);
68
+ getHead().appendChild(dynamic);
69
+
70
+ // set initial style
71
+ setAlwaysStyle(styles.always);
72
+ setDynamicStyle(styles.resting);
73
+
74
+ return () => {
75
+ const remove = (ref) => {
76
+ const current: ?HTMLStyleElement = ref.current;
77
+ invariant(current, 'Cannot unmount ref as it is not set');
78
+ getHead().removeChild(current);
79
+ ref.current = null;
80
+ };
81
+
82
+ remove(alwaysRef);
83
+ remove(dynamicRef);
84
+ };
85
+ }, [
86
+ nonce,
87
+ setAlwaysStyle,
88
+ setDynamicStyle,
89
+ styles.always,
90
+ styles.resting,
91
+ contextId,
92
+ ]);
93
+
94
+ const dragging = useCallback(() => setDynamicStyle(styles.dragging), [
95
+ setDynamicStyle,
96
+ styles.dragging,
97
+ ]);
98
+ const dropping = useCallback(
99
+ (reason: DropReason) => {
100
+ if (reason === 'DROP') {
101
+ setDynamicStyle(styles.dropAnimating);
102
+ return;
103
+ }
104
+ setDynamicStyle(styles.userCancel);
105
+ },
106
+ [setDynamicStyle, styles.dropAnimating, styles.userCancel],
107
+ );
108
+ const resting = useCallback(() => {
109
+ // Can be called defensively
110
+ if (!dynamicRef.current) {
111
+ return;
112
+ }
113
+ setDynamicStyle(styles.resting);
114
+ }, [setDynamicStyle, styles.resting]);
115
+
116
+ const marshal: StyleMarshal = useMemo(
117
+ () => ({
118
+ dragging,
119
+ dropping,
120
+ resting,
121
+ }),
122
+ [dragging, dropping, resting],
123
+ );
124
+
125
+ return marshal;
126
+ }
@@ -0,0 +1,25 @@
1
+ // @flow
2
+ import { useMemo } from 'use-memo-one';
3
+ import type { Id } from '../types';
4
+
5
+ let count: number = 0;
6
+
7
+ type Options = {
8
+ separator: string,
9
+ };
10
+
11
+ const defaults: Options = { separator: '::' };
12
+
13
+ export function reset() {
14
+ count = 0;
15
+ }
16
+
17
+ export default function useUniqueId(
18
+ prefix: string,
19
+ options?: Options = defaults,
20
+ ): Id {
21
+ return useMemo(() => `${prefix}${options.separator}${count++}`, [
22
+ options.separator,
23
+ prefix,
24
+ ]);
25
+ }
@@ -0,0 +1,16 @@
1
+ // @flow
2
+ // https://allyjs.io/tutorials/hiding-elements.html
3
+ // Element is visually hidden but is readable by screen readers
4
+ const visuallyHidden: Object = {
5
+ position: 'absolute',
6
+ width: '1px',
7
+ height: '1px',
8
+ margin: '-1px',
9
+ border: '0',
10
+ padding: '0',
11
+ overflow: 'hidden',
12
+ clip: 'rect(0 0 0 0)',
13
+ 'clip-path': 'inset(100%)',
14
+ };
15
+
16
+ export default visuallyHidden;
@@ -0,0 +1,19 @@
1
+ // @flow
2
+ import type { Position } from 'css-box-model';
3
+ import getMaxScroll from '../../state/get-max-scroll';
4
+ import getDocumentElement from '../get-document-element';
5
+
6
+ export default (): Position => {
7
+ const doc: HTMLElement = getDocumentElement();
8
+
9
+ const maxScroll: Position = getMaxScroll({
10
+ // unclipped padding box, with scrollbar
11
+ scrollHeight: doc.scrollHeight,
12
+ scrollWidth: doc.scrollWidth,
13
+ // clipped padding box, without scrollbar
14
+ width: doc.clientWidth,
15
+ height: doc.clientHeight,
16
+ });
17
+
18
+ return maxScroll;
19
+ };
@@ -0,0 +1,49 @@
1
+ // @flow
2
+ import { getRect, type Rect, type Position } from 'css-box-model';
3
+ import type { Viewport } from '../../types';
4
+ import { origin } from '../../state/position';
5
+ import getWindowScroll from './get-window-scroll';
6
+ import getMaxWindowScroll from './get-max-window-scroll';
7
+ import getDocumentElement from '../get-document-element';
8
+
9
+ export default (): Viewport => {
10
+ const scroll: Position = getWindowScroll();
11
+ const maxScroll: Position = getMaxWindowScroll();
12
+
13
+ const top: number = scroll.y;
14
+ const left: number = scroll.x;
15
+
16
+ // window.innerHeight: includes scrollbars (not what we want)
17
+ // document.clientHeight gives us the correct value when using the html5 doctype
18
+ const doc: HTMLElement = getDocumentElement();
19
+ // Using these values as they do not consider scrollbars
20
+ // padding box, without scrollbar
21
+ const width: number = doc.clientWidth;
22
+ const height: number = doc.clientHeight;
23
+
24
+ // Computed
25
+ const right: number = left + width;
26
+ const bottom: number = top + height;
27
+
28
+ const frame: Rect = getRect({
29
+ top,
30
+ left,
31
+ right,
32
+ bottom,
33
+ });
34
+
35
+ const viewport: Viewport = {
36
+ frame,
37
+ scroll: {
38
+ initial: scroll,
39
+ current: scroll,
40
+ max: maxScroll,
41
+ diff: {
42
+ value: origin,
43
+ displacement: origin,
44
+ },
45
+ },
46
+ };
47
+
48
+ return viewport;
49
+ };
@@ -0,0 +1,3 @@
1
+ // @flow
2
+ export default (el: ?Element): typeof window =>
3
+ el && el.ownerDocument ? el.ownerDocument.defaultView : window;
@@ -0,0 +1,30 @@
1
+ // @flow
2
+ import { type Position } from 'css-box-model';
3
+
4
+ // The browsers update document.documentElement.scrollTop and window.pageYOffset
5
+ // differently as the window scrolls.
6
+
7
+ // Webkit
8
+ // documentElement.scrollTop: no update. Stays at 0
9
+ // window.pageYOffset: updates to whole number
10
+
11
+ // Chrome
12
+ // documentElement.scrollTop: update with fractional value
13
+ // window.pageYOffset: update with fractional value
14
+
15
+ // FireFox
16
+ // documentElement.scrollTop: updates to whole number
17
+ // window.pageYOffset: updates to whole number
18
+
19
+ // IE11 (same as firefox)
20
+ // documentElement.scrollTop: updates to whole number
21
+ // window.pageYOffset: updates to whole number
22
+
23
+ // Edge (same as webkit)
24
+ // documentElement.scrollTop: no update. Stays at 0
25
+ // window.pageYOffset: updates to whole number
26
+
27
+ export default (): Position => ({
28
+ x: window.pageXOffset,
29
+ y: window.pageYOffset,
30
+ });
@@ -0,0 +1,7 @@
1
+ // @flow
2
+ import { type Position } from 'css-box-model';
3
+
4
+ // Not guarenteed to scroll by the entire amount
5
+ export default (change: Position): void => {
6
+ window.scrollBy(change.x, change.y);
7
+ };