@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.
- package/CHANGELOG.md +35 -0
- package/LICENSE +13 -0
- package/README.md +178 -0
- package/dist/react-beautiful-dnd.cjs.js +8728 -0
- package/dist/react-beautiful-dnd.cjs.js.flow +3 -0
- package/dist/react-beautiful-dnd.esm.js +8715 -0
- package/dist/react-beautiful-dnd.js +11726 -0
- package/dist/react-beautiful-dnd.min.js +1 -0
- package/package.json +155 -0
- package/src/animation.js +75 -0
- package/src/debug/middleware/action-timing-average.js +52 -0
- package/src/debug/middleware/action-timing.js +16 -0
- package/src/debug/middleware/log.js +26 -0
- package/src/debug/middleware/user-timing.js +16 -0
- package/src/debug/timings.js +86 -0
- package/src/dev-warning.js +50 -0
- package/src/empty.js +6 -0
- package/src/index.js +67 -0
- package/src/invariant.js +33 -0
- package/src/native-with-fallback.js +69 -0
- package/src/screen-reader-message-preset.js +134 -0
- package/src/state/action-creators.js +328 -0
- package/src/state/auto-scroller/auto-scroller-types.js +8 -0
- package/src/state/auto-scroller/can-scroll.js +160 -0
- package/src/state/auto-scroller/fluid-scroller/config.js +25 -0
- package/src/state/auto-scroller/fluid-scroller/did-start-in-scrollable-area.js +1 -0
- package/src/state/auto-scroller/fluid-scroller/get-best-scrollable-droppable.js +77 -0
- package/src/state/auto-scroller/fluid-scroller/get-droppable-scroll-change.js +50 -0
- package/src/state/auto-scroller/fluid-scroller/get-percentage.js +25 -0
- package/src/state/auto-scroller/fluid-scroller/get-scroll/adjust-for-size-limits.js +30 -0
- package/src/state/auto-scroller/fluid-scroller/get-scroll/buffer-thresholds/calc-axis-scroll-conditions.js +68 -0
- package/src/state/auto-scroller/fluid-scroller/get-scroll/buffer-thresholds/get-scroll-conditions.js +56 -0
- package/src/state/auto-scroller/fluid-scroller/get-scroll/buffer-thresholds/index.js +66 -0
- package/src/state/auto-scroller/fluid-scroller/get-scroll/get-scroll-on-axis/dampen-value-by-time.js +48 -0
- package/src/state/auto-scroller/fluid-scroller/get-scroll/get-scroll-on-axis/get-distance-thresholds.js +31 -0
- package/src/state/auto-scroller/fluid-scroller/get-scroll/get-scroll-on-axis/get-value-from-distance.js +67 -0
- package/src/state/auto-scroller/fluid-scroller/get-scroll/get-scroll-on-axis/get-value.js +51 -0
- package/src/state/auto-scroller/fluid-scroller/get-scroll/get-scroll-on-axis/index.js +50 -0
- package/src/state/auto-scroller/fluid-scroller/get-scroll/get-scroll-on-axis/min-scroll.js +4 -0
- package/src/state/auto-scroller/fluid-scroller/get-scroll/index.js +139 -0
- package/src/state/auto-scroller/fluid-scroller/get-window-scroll-change.js +43 -0
- package/src/state/auto-scroller/fluid-scroller/index.js +99 -0
- package/src/state/auto-scroller/fluid-scroller/scroll.js +80 -0
- package/src/state/auto-scroller/index.js +59 -0
- package/src/state/auto-scroller/jump-scroller.js +139 -0
- package/src/state/axis.js +26 -0
- package/src/state/calculate-drag-impact/calculate-reorder-impact.js +136 -0
- package/src/state/can-start-drag.js +29 -0
- package/src/state/create-store.js +97 -0
- package/src/state/did-start-after-critical.js +9 -0
- package/src/state/dimension-marshal/dimension-marshal-types.js +46 -0
- package/src/state/dimension-marshal/dimension-marshal.js +218 -0
- package/src/state/dimension-marshal/get-initial-publish.js +66 -0
- package/src/state/dimension-marshal/while-dragging-publisher.js +146 -0
- package/src/state/dimension-structures.js +35 -0
- package/src/state/droppable/get-droppable.js +101 -0
- package/src/state/droppable/is-home-of.js +7 -0
- package/src/state/droppable/scroll-droppable.js +53 -0
- package/src/state/droppable/should-use-placeholder.js +7 -0
- package/src/state/droppable/util/clip.js +17 -0
- package/src/state/droppable/util/get-subject.js +63 -0
- package/src/state/droppable/what-is-dragged-over-from-result.js +16 -0
- package/src/state/droppable/what-is-dragged-over.js +16 -0
- package/src/state/droppable/with-placeholder.js +174 -0
- package/src/state/get-center-from-impact/get-client-border-box-center/get-client-from-page-border-box-center.js +29 -0
- package/src/state/get-center-from-impact/get-client-border-box-center/index.js +44 -0
- package/src/state/get-center-from-impact/get-page-border-box-center/index.js +70 -0
- package/src/state/get-center-from-impact/get-page-border-box-center/when-combining.js +39 -0
- package/src/state/get-center-from-impact/get-page-border-box-center/when-reordering.js +112 -0
- package/src/state/get-center-from-impact/move-relative-to.js +66 -0
- package/src/state/get-combined-item-displacement.js +34 -0
- package/src/state/get-displaced-by.js +17 -0
- package/src/state/get-displacement-groups.js +130 -0
- package/src/state/get-drag-impact/get-combine-impact.js +130 -0
- package/src/state/get-drag-impact/get-reorder-impact.js +143 -0
- package/src/state/get-drag-impact/index.js +93 -0
- package/src/state/get-draggables-inside-droppable.js +31 -0
- package/src/state/get-droppable-over.js +158 -0
- package/src/state/get-frame.js +10 -0
- package/src/state/get-home-location.js +7 -0
- package/src/state/get-impact-location.js +16 -0
- package/src/state/get-is-displaced.js +11 -0
- package/src/state/get-lift-effect.js +82 -0
- package/src/state/get-max-scroll.js +30 -0
- package/src/state/is-movement-allowed.js +6 -0
- package/src/state/is-within.js +9 -0
- package/src/state/middleware/auto-scroll.js +38 -0
- package/src/state/middleware/dimension-marshal-stopper.js +20 -0
- package/src/state/middleware/drop/drop-animation-finish-middleware.js +21 -0
- package/src/state/middleware/drop/drop-animation-flush-on-scroll-middleware.js +63 -0
- package/src/state/middleware/drop/drop-middleware.js +146 -0
- package/src/state/middleware/drop/get-drop-duration.js +47 -0
- package/src/state/middleware/drop/get-drop-impact.js +77 -0
- package/src/state/middleware/drop/get-new-home-client-offset.js +54 -0
- package/src/state/middleware/drop/index.js +2 -0
- package/src/state/middleware/focus.js +42 -0
- package/src/state/middleware/lift.js +66 -0
- package/src/state/middleware/pending-drop.js +37 -0
- package/src/state/middleware/responders/async-marshal.js +55 -0
- package/src/state/middleware/responders/expiring-announce.js +44 -0
- package/src/state/middleware/responders/index.js +2 -0
- package/src/state/middleware/responders/is-equal.js +57 -0
- package/src/state/middleware/responders/publisher.js +253 -0
- package/src/state/middleware/responders/responders-middleware.js +75 -0
- package/src/state/middleware/scroll-listener.js +31 -0
- package/src/state/middleware/style.js +22 -0
- package/src/state/middleware/util/validate-dimensions.js +71 -0
- package/src/state/move-in-direction/index.js +84 -0
- package/src/state/move-in-direction/move-cross-axis/get-best-cross-axis-droppable.js +168 -0
- package/src/state/move-in-direction/move-cross-axis/get-closest-draggable.js +79 -0
- package/src/state/move-in-direction/move-cross-axis/index.js +109 -0
- package/src/state/move-in-direction/move-cross-axis/move-to-new-droppable.js +121 -0
- package/src/state/move-in-direction/move-cross-axis/without-starting-displacement.js +31 -0
- package/src/state/move-in-direction/move-in-direction-types.js +9 -0
- package/src/state/move-in-direction/move-to-next-place/index.js +132 -0
- package/src/state/move-in-direction/move-to-next-place/is-totally-visible-in-new-location.js +52 -0
- package/src/state/move-in-direction/move-to-next-place/move-to-next-combine/index.js +97 -0
- package/src/state/move-in-direction/move-to-next-place/move-to-next-index/from-combine.js +52 -0
- package/src/state/move-in-direction/move-to-next-place/move-to-next-index/from-reorder.js +43 -0
- package/src/state/move-in-direction/move-to-next-place/move-to-next-index/index.js +86 -0
- package/src/state/no-impact.js +33 -0
- package/src/state/patch-dimension-map.js +11 -0
- package/src/state/patch-droppable-map.js +10 -0
- package/src/state/position.js +58 -0
- package/src/state/post-reducer/when-moving/refresh-snap.js +67 -0
- package/src/state/post-reducer/when-moving/update.js +120 -0
- package/src/state/publish-while-dragging-in-virtual/adjust-additions-for-scroll-changes.js +58 -0
- package/src/state/publish-while-dragging-in-virtual/index.js +158 -0
- package/src/state/publish-while-dragging-in-virtual/offset-draggable.js +35 -0
- package/src/state/recompute-placeholders.js +99 -0
- package/src/state/rect.js +7 -0
- package/src/state/reducer.js +457 -0
- package/src/state/registry/create-registry.js +162 -0
- package/src/state/registry/registry-types.js +98 -0
- package/src/state/registry/use-registry.js +20 -0
- package/src/state/remove-draggable-from-list.js +13 -0
- package/src/state/scroll-viewport.js +34 -0
- package/src/state/spacing.js +45 -0
- package/src/state/store-types.js +16 -0
- package/src/state/update-displacement-visibility/recompute.js +54 -0
- package/src/state/update-displacement-visibility/speculatively-increase.js +111 -0
- package/src/state/visibility/is-partially-visible-through-frame.js +60 -0
- package/src/state/visibility/is-position-in-frame.js +12 -0
- package/src/state/visibility/is-totally-visible-through-frame-on-axis.js +19 -0
- package/src/state/visibility/is-totally-visible-through-frame.js +18 -0
- package/src/state/visibility/is-visible.js +102 -0
- package/src/state/with-scroll-change/with-all-displacement.js +15 -0
- package/src/state/with-scroll-change/with-droppable-displacement.js +13 -0
- package/src/state/with-scroll-change/with-droppable-scroll.js +13 -0
- package/src/state/with-scroll-change/with-viewport-displacement.js +7 -0
- package/src/types.js +542 -0
- package/src/view/animate-in-out/animate-in-out.jsx +95 -0
- package/src/view/animate-in-out/index.js +2 -0
- package/src/view/check-is-valid-inner-ref.js +15 -0
- package/src/view/context/app-context.js +19 -0
- package/src/view/context/droppable-context.js +11 -0
- package/src/view/context/store-context.js +5 -0
- package/src/view/data-attributes.js +37 -0
- package/src/view/drag-drop-context/app.jsx +273 -0
- package/src/view/drag-drop-context/check-doctype.js +39 -0
- package/src/view/drag-drop-context/check-react-version.js +71 -0
- package/src/view/drag-drop-context/drag-drop-context-types.js +7 -0
- package/src/view/drag-drop-context/drag-drop-context.jsx +68 -0
- package/src/view/drag-drop-context/error-boundary.jsx +88 -0
- package/src/view/drag-drop-context/index.js +2 -0
- package/src/view/drag-drop-context/use-startup-validation.js +13 -0
- package/src/view/drag-drop-context/use-unique-context-id.js +13 -0
- package/src/view/draggable/connected-draggable.js +372 -0
- package/src/view/draggable/draggable-api.jsx +48 -0
- package/src/view/draggable/draggable-types.js +191 -0
- package/src/view/draggable/draggable.jsx +171 -0
- package/src/view/draggable/get-style.js +109 -0
- package/src/view/draggable/index.js +2 -0
- package/src/view/draggable/use-validation.js +70 -0
- package/src/view/droppable/connected-droppable.js +280 -0
- package/src/view/droppable/droppable-types.js +91 -0
- package/src/view/droppable/droppable.jsx +167 -0
- package/src/view/droppable/index.js +2 -0
- package/src/view/droppable/use-validation.js +101 -0
- package/src/view/event-bindings/bind-events.js +39 -0
- package/src/view/event-bindings/event-types.js +14 -0
- package/src/view/get-body-element.js +8 -0
- package/src/view/get-border-box-center-position.js +5 -0
- package/src/view/get-document-element.js +8 -0
- package/src/view/get-elements/find-drag-handle.js +38 -0
- package/src/view/get-elements/find-draggable.js +30 -0
- package/src/view/is-strict-equal.js +2 -0
- package/src/view/is-type-of-element/is-element.js +6 -0
- package/src/view/is-type-of-element/is-html-element.js +6 -0
- package/src/view/is-type-of-element/is-svg-element.js +12 -0
- package/src/view/key-codes.js +13 -0
- package/src/view/placeholder/index.js +2 -0
- package/src/view/placeholder/placeholder-types.js +16 -0
- package/src/view/placeholder/placeholder.jsx +198 -0
- package/src/view/scroll-listener.js +72 -0
- package/src/view/throw-if-invalid-inner-ref.js +15 -0
- package/src/view/use-announcer/index.js +2 -0
- package/src/view/use-announcer/use-announcer.js +80 -0
- package/src/view/use-dev-setup-warning.js +22 -0
- package/src/view/use-dev.js +9 -0
- package/src/view/use-draggable-publisher/get-dimension.js +44 -0
- package/src/view/use-draggable-publisher/index.js +2 -0
- package/src/view/use-draggable-publisher/use-draggable-publisher.js +87 -0
- package/src/view/use-droppable-publisher/check-for-nested-scroll-container.js +27 -0
- package/src/view/use-droppable-publisher/get-closest-scrollable.js +95 -0
- package/src/view/use-droppable-publisher/get-dimension.js +139 -0
- package/src/view/use-droppable-publisher/get-env.js +31 -0
- package/src/view/use-droppable-publisher/get-listener-options.js +12 -0
- package/src/view/use-droppable-publisher/get-scroll.js +7 -0
- package/src/view/use-droppable-publisher/index.js +2 -0
- package/src/view/use-droppable-publisher/is-in-fixed-container.js +21 -0
- package/src/view/use-droppable-publisher/use-droppable-publisher.js +283 -0
- package/src/view/use-focus-marshal/focus-marshal-types.js +13 -0
- package/src/view/use-focus-marshal/index.js +2 -0
- package/src/view/use-focus-marshal/use-focus-marshal.js +129 -0
- package/src/view/use-hidden-text-element/index.js +2 -0
- package/src/view/use-hidden-text-element/use-hidden-text-element.js +60 -0
- package/src/view/use-isomorphic-layout-effect.js +18 -0
- package/src/view/use-previous-ref.js +14 -0
- package/src/view/use-required-context.js +9 -0
- package/src/view/use-sensor-marshal/closest.js +50 -0
- package/src/view/use-sensor-marshal/find-closest-draggable-id-from-event.js +50 -0
- package/src/view/use-sensor-marshal/index.js +5 -0
- package/src/view/use-sensor-marshal/is-event-in-interactive-element.js +66 -0
- package/src/view/use-sensor-marshal/lock.js +48 -0
- package/src/view/use-sensor-marshal/sensors/use-keyboard-sensor.js +243 -0
- package/src/view/use-sensor-marshal/sensors/use-mouse-sensor.js +386 -0
- package/src/view/use-sensor-marshal/sensors/use-touch-sensor.js +461 -0
- package/src/view/use-sensor-marshal/sensors/util/prevent-standard-key-events.js +19 -0
- package/src/view/use-sensor-marshal/sensors/util/supported-page-visibility-event-name.js +29 -0
- package/src/view/use-sensor-marshal/use-sensor-marshal.js +495 -0
- package/src/view/use-sensor-marshal/use-validate-sensor-hooks.js +20 -0
- package/src/view/use-style-marshal/get-styles.js +170 -0
- package/src/view/use-style-marshal/index.js +2 -0
- package/src/view/use-style-marshal/style-marshal-types.js +8 -0
- package/src/view/use-style-marshal/use-style-marshal.js +126 -0
- package/src/view/use-unique-id.js +25 -0
- package/src/view/visually-hidden-style.js +16 -0
- package/src/view/window/get-max-window-scroll.js +19 -0
- package/src/view/window/get-viewport.js +49 -0
- package/src/view/window/get-window-from-el.js +3 -0
- package/src/view/window/get-window-scroll.js +30 -0
- 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,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
|
+
});
|