@semcore/core 17.0.0 → 17.0.1-prerelease.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 +3 -111
- package/README.md +35 -5
- package/lib/LastInteractionType.js +36 -22
- package/lib/LastInteractionType.js.map +1 -1
- package/lib/LastInteractionType.mjs +33 -19
- package/lib/LastInteractionType.mjs.map +1 -1
- package/lib/core-types/Component.js +41 -25
- package/lib/core-types/Component.js.map +1 -1
- package/lib/core-types/Component.mjs +38 -18
- package/lib/core-types/Component.mjs.map +1 -1
- package/lib/core-types/symbols.js +9 -9
- package/lib/core-types/symbols.js.map +1 -1
- package/lib/core-types/symbols.mjs +9 -9
- package/lib/core-types/symbols.mjs.map +1 -1
- package/lib/coreFactory.js +238 -158
- package/lib/coreFactory.js.map +1 -1
- package/lib/coreFactory.mjs +189 -133
- package/lib/coreFactory.mjs.map +1 -1
- package/lib/decorators/propsObserver.js +64 -36
- package/lib/decorators/propsObserver.js.map +1 -1
- package/lib/decorators/propsObserver.mjs +61 -33
- package/lib/decorators/propsObserver.mjs.map +1 -1
- package/lib/decorators/reactive.js +17 -17
- package/lib/decorators/reactive.js.map +1 -1
- package/lib/decorators/reactive.mjs +15 -15
- package/lib/decorators/reactive.mjs.map +1 -1
- package/lib/enhancement/Children.js +59 -51
- package/lib/enhancement/Children.js.map +1 -1
- package/lib/enhancement/Children.mjs +41 -47
- package/lib/enhancement/Children.mjs.map +1 -1
- package/lib/enhancement/Root.js +37 -36
- package/lib/enhancement/Root.js.map +1 -1
- package/lib/enhancement/Root.mjs +18 -28
- package/lib/enhancement/Root.mjs.map +1 -1
- package/lib/enhancement/dataName.js +8 -7
- package/lib/enhancement/dataName.js.map +1 -1
- package/lib/enhancement/dataName.mjs +5 -5
- package/lib/enhancement/dataName.mjs.map +1 -1
- package/lib/enhancement/enhance.js +9 -6
- package/lib/enhancement/enhance.js.map +1 -1
- package/lib/enhancement/enhance.mjs +7 -4
- package/lib/enhancement/enhance.mjs.map +1 -1
- package/lib/enhancement/functionDefaultProps.js +6 -6
- package/lib/enhancement/functionDefaultProps.js.map +1 -1
- package/lib/enhancement/functionDefaultProps.mjs +4 -4
- package/lib/enhancement/functionDefaultProps.mjs.map +1 -1
- package/lib/enhancement/i18n.js +13 -13
- package/lib/enhancement/i18n.js.map +1 -1
- package/lib/enhancement/i18n.mjs +9 -10
- package/lib/enhancement/i18n.mjs.map +1 -1
- package/lib/enhancement/inheritedName.js +8 -7
- package/lib/enhancement/inheritedName.js.map +1 -1
- package/lib/enhancement/inheritedName.mjs +5 -5
- package/lib/enhancement/inheritedName.mjs.map +1 -1
- package/lib/enhancement/staticChildren.js +56 -47
- package/lib/enhancement/staticChildren.js.map +1 -1
- package/lib/enhancement/staticChildren.mjs +48 -43
- package/lib/enhancement/staticChildren.mjs.map +1 -1
- package/lib/enhancement/style.js +27 -29
- package/lib/enhancement/style.js.map +1 -1
- package/lib/enhancement/style.mjs +20 -26
- package/lib/enhancement/style.mjs.map +1 -1
- package/lib/enhancement/uncontrolledProps.js +65 -46
- package/lib/enhancement/uncontrolledProps.js.map +1 -1
- package/lib/enhancement/uncontrolledProps.mjs +52 -43
- package/lib/enhancement/uncontrolledProps.mjs.map +1 -1
- package/lib/esm/LastInteractionType.mjs +33 -19
- package/lib/esm/core-types/Component.mjs +38 -18
- package/lib/esm/core-types/symbols.mjs +9 -9
- package/lib/esm/coreFactory.mjs +189 -133
- package/lib/esm/enhancement/Children.mjs +41 -47
- package/lib/esm/enhancement/Root.mjs +18 -28
- package/lib/esm/enhancement/dataName.mjs +5 -5
- package/lib/esm/enhancement/enhance.mjs +7 -4
- package/lib/esm/enhancement/functionDefaultProps.mjs +4 -4
- package/lib/esm/enhancement/i18n.mjs +9 -10
- package/lib/esm/enhancement/inheritedName.mjs +5 -5
- package/lib/esm/enhancement/staticChildren.mjs +48 -43
- package/lib/esm/enhancement/style.mjs +20 -26
- package/lib/esm/enhancement/uncontrolledProps.mjs +52 -43
- package/lib/esm/register.mjs +20 -12
- package/lib/esm/styled/reshadow-core.mjs +111 -98
- package/lib/esm/styled/sstyled.mjs +41 -31
- package/lib/esm/utils/assignProps.mjs +36 -32
- package/lib/esm/utils/enhances/WithI18n.mjs +17 -15
- package/lib/esm/utils/enhances/i18nEnhance.mjs +61 -47
- package/lib/esm/utils/logger.mjs +21 -13
- package/lib/esm/utils/pick.mjs +4 -4
- package/lib/esm/utils/ref.mjs +43 -27
- package/lib/esm/utils/use/useEnhancedEffect.mjs +1 -1
- package/lib/index.js +17 -17
- package/lib/register.js +24 -17
- package/lib/register.js.map +1 -1
- package/lib/register.mjs +20 -12
- package/lib/register.mjs.map +1 -1
- package/lib/styled/index.js +4 -4
- package/lib/styled/reshadow-core.js +104 -102
- package/lib/styled/reshadow-core.js.map +1 -1
- package/lib/styled/reshadow-core.mjs +111 -98
- package/lib/styled/reshadow-core.mjs.map +1 -1
- package/lib/styled/sstyled.js +53 -31
- package/lib/styled/sstyled.js.map +1 -1
- package/lib/styled/sstyled.mjs +41 -31
- package/lib/styled/sstyled.mjs.map +1 -1
- package/lib/theme/themes/dark.js +2 -2
- package/lib/theme/themes/dark.js.map +1 -1
- package/lib/theme/themes/default.js +2 -2
- package/lib/theme/themes/default.js.map +1 -1
- package/lib/theme/themes/highlights-dark.js +2 -2
- package/lib/theme/themes/highlights-dark.js.map +1 -1
- package/lib/theme/themes/highlights-light.js +2 -2
- package/lib/theme/themes/highlights-light.js.map +1 -1
- package/lib/theme/themes/light.js +2 -2
- package/lib/theme/themes/light.js.map +1 -1
- package/lib/utils/CSSinJS.js +10 -8
- package/lib/utils/CSSinJS.js.map +1 -1
- package/lib/utils/CSSinJS.mjs +7 -6
- package/lib/utils/CSSinJS.mjs.map +1 -1
- package/lib/utils/ThemeProvider.js +51 -44
- package/lib/utils/ThemeProvider.js.map +1 -1
- package/lib/utils/ThemeProvider.mjs +47 -36
- package/lib/utils/ThemeProvider.mjs.map +1 -1
- package/lib/utils/addonText.js +7 -4
- package/lib/utils/addonText.js.map +1 -1
- package/lib/utils/addonText.mjs +5 -2
- package/lib/utils/addonText.mjs.map +1 -1
- package/lib/utils/addonTextChildren.js +21 -15
- package/lib/utils/addonTextChildren.js.map +1 -1
- package/lib/utils/addonTextChildren.mjs +13 -7
- package/lib/utils/addonTextChildren.mjs.map +1 -1
- package/lib/utils/ariaProps.js +5 -7
- package/lib/utils/ariaProps.js.map +1 -1
- package/lib/utils/ariaProps.mjs +5 -7
- package/lib/utils/ariaProps.mjs.map +1 -1
- package/lib/utils/assignProps.js +37 -33
- package/lib/utils/assignProps.js.map +1 -1
- package/lib/utils/assignProps.mjs +36 -32
- package/lib/utils/assignProps.mjs.map +1 -1
- package/lib/utils/canUseDOM.js +1 -1
- package/lib/utils/capitalizeFirstLetter.js +1 -1
- package/lib/utils/color.js +95 -72
- package/lib/utils/color.js.map +1 -1
- package/lib/utils/color.mjs +94 -71
- package/lib/utils/color.mjs.map +1 -1
- package/lib/utils/compose.js +12 -3
- package/lib/utils/compose.js.map +1 -1
- package/lib/utils/compose.mjs +11 -2
- package/lib/utils/compose.mjs.map +1 -1
- package/lib/utils/createUUID.js +5 -5
- package/lib/utils/createUUID.js.map +1 -1
- package/lib/utils/createUUID.mjs +4 -4
- package/lib/utils/createUUID.mjs.map +1 -1
- package/lib/utils/cssToIntDefault.js +4 -3
- package/lib/utils/cssToIntDefault.js.map +1 -1
- package/lib/utils/cssToIntDefault.mjs +3 -2
- package/lib/utils/cssToIntDefault.mjs.map +1 -1
- package/lib/utils/enhances/WithCSS.js +8 -10
- package/lib/utils/enhances/WithCSS.js.map +1 -1
- package/lib/utils/enhances/WithCSS.mjs +6 -7
- package/lib/utils/enhances/WithCSS.mjs.map +1 -1
- package/lib/utils/enhances/WithI18n.js +19 -19
- package/lib/utils/enhances/WithI18n.js.map +1 -1
- package/lib/utils/enhances/WithI18n.mjs +17 -15
- package/lib/utils/enhances/WithI18n.mjs.map +1 -1
- package/lib/utils/enhances/a11yEnhance.js +39 -34
- package/lib/utils/enhances/a11yEnhance.js.map +1 -1
- package/lib/utils/enhances/a11yEnhance.mjs +36 -32
- package/lib/utils/enhances/a11yEnhance.mjs.map +1 -1
- package/lib/utils/enhances/animatedSizeEnhance.js +63 -55
- package/lib/utils/enhances/animatedSizeEnhance.js.map +1 -1
- package/lib/utils/enhances/animatedSizeEnhance.mjs +58 -50
- package/lib/utils/enhances/animatedSizeEnhance.mjs.map +1 -1
- package/lib/utils/enhances/contextEnhance.js +11 -12
- package/lib/utils/enhances/contextEnhance.js.map +1 -1
- package/lib/utils/enhances/contextEnhance.mjs +8 -9
- package/lib/utils/enhances/contextEnhance.mjs.map +1 -1
- package/lib/utils/enhances/i18nEnhance.js +67 -51
- package/lib/utils/enhances/i18nEnhance.js.map +1 -1
- package/lib/utils/enhances/i18nEnhance.mjs +61 -47
- package/lib/utils/enhances/i18nEnhance.mjs.map +1 -1
- package/lib/utils/enhances/resolveColorEnhance.js +10 -12
- package/lib/utils/enhances/resolveColorEnhance.js.map +1 -1
- package/lib/utils/enhances/resolveColorEnhance.mjs +6 -8
- package/lib/utils/enhances/resolveColorEnhance.mjs.map +1 -1
- package/lib/utils/eventEmitter.js +57 -30
- package/lib/utils/eventEmitter.js.map +1 -1
- package/lib/utils/eventEmitter.mjs +55 -26
- package/lib/utils/eventEmitter.mjs.map +1 -1
- package/lib/utils/findComponent.js +42 -35
- package/lib/utils/findComponent.js.map +1 -1
- package/lib/utils/findComponent.mjs +33 -26
- package/lib/utils/findComponent.mjs.map +1 -1
- package/lib/utils/fire.js +13 -7
- package/lib/utils/fire.js.map +1 -1
- package/lib/utils/fire.mjs +11 -5
- package/lib/utils/fire.mjs.map +1 -1
- package/lib/utils/focus-lock/focusBorders.js +32 -28
- package/lib/utils/focus-lock/focusBorders.js.map +1 -1
- package/lib/utils/focus-lock/focusBorders.mjs +32 -26
- package/lib/utils/focus-lock/focusBorders.mjs.map +1 -1
- package/lib/utils/focus-lock/getFocusableIn.js +6 -4
- package/lib/utils/focus-lock/getFocusableIn.js.map +1 -1
- package/lib/utils/focus-lock/getFocusableIn.mjs +6 -3
- package/lib/utils/focus-lock/getFocusableIn.mjs.map +1 -1
- package/lib/utils/focus-lock/isFocusInside.js +6 -5
- package/lib/utils/focus-lock/isFocusInside.js.map +1 -1
- package/lib/utils/focus-lock/isFocusInside.mjs +6 -4
- package/lib/utils/focus-lock/isFocusInside.mjs.map +1 -1
- package/lib/utils/focus-lock/isFocusable.js +12 -9
- package/lib/utils/focus-lock/isFocusable.js.map +1 -1
- package/lib/utils/focus-lock/isFocusable.mjs +11 -8
- package/lib/utils/focus-lock/isFocusable.mjs.map +1 -1
- package/lib/utils/focus-lock/setFocus.js +27 -21
- package/lib/utils/focus-lock/setFocus.js.map +1 -1
- package/lib/utils/focus-lock/setFocus.mjs +25 -19
- package/lib/utils/focus-lock/setFocus.mjs.map +1 -1
- package/lib/utils/getAccessibleName.js +22 -10
- package/lib/utils/getAccessibleName.js.map +1 -1
- package/lib/utils/getAccessibleName.mjs +21 -10
- package/lib/utils/getAccessibleName.mjs.map +1 -1
- package/lib/utils/getDisplayName.js +1 -1
- package/lib/utils/getEventTarget.js +32 -13
- package/lib/utils/getEventTarget.js.map +1 -1
- package/lib/utils/getEventTarget.mjs +31 -12
- package/lib/utils/getEventTarget.mjs.map +1 -1
- package/lib/utils/getOriginChildren.js +4 -4
- package/lib/utils/getOriginChildren.js.map +1 -1
- package/lib/utils/getRandomInt.js +1 -1
- package/lib/utils/getValue.js +6 -4
- package/lib/utils/getValue.js.map +1 -1
- package/lib/utils/getValue.mjs +5 -3
- package/lib/utils/getValue.mjs.map +1 -1
- package/lib/utils/hasLabels.js +27 -16
- package/lib/utils/hasLabels.js.map +1 -1
- package/lib/utils/hasLabels.mjs +24 -14
- package/lib/utils/hasLabels.mjs.map +1 -1
- package/lib/utils/hasParent.js +2 -3
- package/lib/utils/hasParent.js.map +1 -1
- package/lib/utils/hasParent.mjs +3 -2
- package/lib/utils/hasParent.mjs.map +1 -1
- package/lib/utils/ifChildren.js +4 -6
- package/lib/utils/ifChildren.js.map +1 -1
- package/lib/utils/ifChildren.mjs +2 -4
- package/lib/utils/ifChildren.mjs.map +1 -1
- package/lib/utils/indentStyles.js +10 -5
- package/lib/utils/indentStyles.js.map +1 -1
- package/lib/utils/indentStyles.mjs +9 -5
- package/lib/utils/indentStyles.mjs.map +1 -1
- package/lib/utils/injectStyle.js +13 -11
- package/lib/utils/injectStyle.js.map +1 -1
- package/lib/utils/injectStyle.mjs +10 -9
- package/lib/utils/injectStyle.mjs.map +1 -1
- package/lib/utils/inputProps.js +5 -5
- package/lib/utils/inputProps.js.map +1 -1
- package/lib/utils/inputProps.mjs +4 -4
- package/lib/utils/inputProps.mjs.map +1 -1
- package/lib/utils/isInteractiveElement.js +9 -7
- package/lib/utils/isInteractiveElement.js.map +1 -1
- package/lib/utils/isInteractiveElement.mjs +9 -7
- package/lib/utils/isInteractiveElement.mjs.map +1 -1
- package/lib/utils/isNode.js +5 -4
- package/lib/utils/isNode.js.map +1 -1
- package/lib/utils/isNode.mjs +2 -1
- package/lib/utils/isNode.mjs.map +1 -1
- package/lib/utils/isPromise.js +1 -1
- package/lib/utils/isRetina.js +2 -7
- package/lib/utils/isRetina.js.map +1 -1
- package/lib/utils/isRetina.mjs +1 -6
- package/lib/utils/isRetina.mjs.map +1 -1
- package/lib/utils/logger.js +25 -18
- package/lib/utils/logger.js.map +1 -1
- package/lib/utils/logger.mjs +21 -13
- package/lib/utils/logger.mjs.map +1 -1
- package/lib/utils/numericChecker.js +18 -11
- package/lib/utils/numericChecker.js.map +1 -1
- package/lib/utils/numericChecker.mjs +17 -10
- package/lib/utils/numericChecker.mjs.map +1 -1
- package/lib/utils/ownerDocument.js +2 -2
- package/lib/utils/ownerDocument.js.map +1 -1
- package/lib/utils/ownerDocument.mjs +1 -1
- package/lib/utils/ownerDocument.mjs.map +1 -1
- package/lib/utils/pick.js +5 -5
- package/lib/utils/pick.js.map +1 -1
- package/lib/utils/pick.mjs +4 -4
- package/lib/utils/pick.mjs.map +1 -1
- package/lib/utils/propsForElement.js +12 -10
- package/lib/utils/propsForElement.js.map +1 -1
- package/lib/utils/propsForElement.mjs +10 -8
- package/lib/utils/propsForElement.mjs.map +1 -1
- package/lib/utils/rafTrottle.js +14 -9
- package/lib/utils/rafTrottle.js.map +1 -1
- package/lib/utils/rafTrottle.mjs +12 -7
- package/lib/utils/rafTrottle.mjs.map +1 -1
- package/lib/utils/reactToText.js +8 -5
- package/lib/utils/reactToText.js.map +1 -1
- package/lib/utils/reactToText.mjs +6 -3
- package/lib/utils/reactToText.mjs.map +1 -1
- package/lib/utils/ref.js +47 -29
- package/lib/utils/ref.js.map +1 -1
- package/lib/utils/ref.mjs +43 -27
- package/lib/utils/ref.mjs.map +1 -1
- package/lib/utils/setRef.js +2 -2
- package/lib/utils/setRef.js.map +1 -1
- package/lib/utils/syncScroll.js +24 -24
- package/lib/utils/syncScroll.js.map +1 -1
- package/lib/utils/syncScroll.mjs +21 -21
- package/lib/utils/syncScroll.mjs.map +1 -1
- package/lib/utils/uncontroll.js +18 -8
- package/lib/utils/uncontroll.js.map +1 -1
- package/lib/utils/uncontroll.mjs +17 -8
- package/lib/utils/uncontroll.mjs.map +1 -1
- package/lib/utils/uniqueID.js +27 -22
- package/lib/utils/uniqueID.js.map +1 -1
- package/lib/utils/uniqueID.mjs +25 -18
- package/lib/utils/uniqueID.mjs.map +1 -1
- package/lib/utils/use/useColorResolver.js +22 -21
- package/lib/utils/use/useColorResolver.js.map +1 -1
- package/lib/utils/use/useColorResolver.mjs +19 -17
- package/lib/utils/use/useColorResolver.mjs.map +1 -1
- package/lib/utils/use/useEnhancedEffect.js +4 -4
- package/lib/utils/use/useEnhancedEffect.js.map +1 -1
- package/lib/utils/use/useEnhancedEffect.mjs +1 -1
- package/lib/utils/use/useEnhancedEffect.mjs.map +1 -1
- package/lib/utils/use/useEventCallback.js +10 -5
- package/lib/utils/use/useEventCallback.js.map +1 -1
- package/lib/utils/use/useEventCallback.mjs +8 -3
- package/lib/utils/use/useEventCallback.mjs.map +1 -1
- package/lib/utils/use/useEventListener.js +15 -11
- package/lib/utils/use/useEventListener.js.map +1 -1
- package/lib/utils/use/useEventListener.mjs +11 -7
- package/lib/utils/use/useEventListener.mjs.map +1 -1
- package/lib/utils/use/useFocusLock.js +94 -80
- package/lib/utils/use/useFocusLock.js.map +1 -1
- package/lib/utils/use/useFocusLock.mjs +88 -71
- package/lib/utils/use/useFocusLock.mjs.map +1 -1
- package/lib/utils/use/usePreventScroll.js +26 -24
- package/lib/utils/use/usePreventScroll.js.map +1 -1
- package/lib/utils/use/usePreventScroll.mjs +21 -19
- package/lib/utils/use/usePreventScroll.mjs.map +1 -1
- package/lib/utils/use/useScrollBarWidth.js +14 -8
- package/lib/utils/use/useScrollBarWidth.js.map +1 -1
- package/lib/utils/use/useScrollBarWidth.mjs +13 -8
- package/lib/utils/use/useScrollBarWidth.mjs.map +1 -1
- package/lib/utils/useCssVariable.js +37 -32
- package/lib/utils/useCssVariable.js.map +1 -1
- package/lib/utils/useCssVariable.mjs +34 -27
- package/lib/utils/useCssVariable.mjs.map +1 -1
- package/lib/utils/zIndexStacking.js +24 -28
- package/lib/utils/zIndexStacking.js.map +1 -1
- package/lib/utils/zIndexStacking.mjs +22 -23
- package/lib/utils/zIndexStacking.mjs.map +1 -1
- package/package.json +12 -316
- package/vite.config.ts +0 -22
- package/tsconfig-utils.json +0 -4
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import _typeof from "@babel/runtime/helpers/esm/typeof";
|
|
2
|
+
import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
|
|
1
3
|
import LocalReact from 'react';
|
|
2
4
|
import canUseDOM from "../canUseDOM.mjs";
|
|
3
5
|
import { addFocusBorders, removeFocusBorders } from "../focus-lock/focusBorders.mjs";
|
|
@@ -6,7 +8,7 @@ import { isFocusInside } from "../focus-lock/isFocusInside.mjs";
|
|
|
6
8
|
import { setFocus } from "../focus-lock/setFocus.mjs";
|
|
7
9
|
import { hasParent } from "../hasParent.mjs";
|
|
8
10
|
export { isFocusInside, setFocus };
|
|
9
|
-
|
|
11
|
+
var syntheticEvents = {
|
|
10
12
|
blur: 'focusout-intergalactic-focus-lock-synthetic',
|
|
11
13
|
keydown: 'keydown-intergalactic-focus-lock-synthetic'
|
|
12
14
|
};
|
|
@@ -14,14 +16,14 @@ const syntheticEvents = {
|
|
|
14
16
|
* Synthetic event are special events that always bypass all propagation guards and reaches focus lock event listeners.
|
|
15
17
|
* You should always prevent native event propagation in order to prevent focus enforcing double calls.
|
|
16
18
|
*/
|
|
17
|
-
export
|
|
18
|
-
|
|
19
|
-
|
|
19
|
+
export var makeFocusLockSyntheticEvent = function makeFocusLockSyntheticEvent(baseEvent) {
|
|
20
|
+
var event = baseEvent;
|
|
21
|
+
var type = event.type;
|
|
20
22
|
if (!(type in syntheticEvents)) {
|
|
21
|
-
|
|
22
|
-
throw new Error(
|
|
23
|
+
var supported = Object.keys(syntheticEvents).join(', ');
|
|
24
|
+
throw new Error("Unable to make synthetic event for ".concat(type, ", ").concat(supported, " are supported"));
|
|
23
25
|
}
|
|
24
|
-
|
|
26
|
+
var syntheticEvent = new Event(syntheticEvents[type], {
|
|
25
27
|
bubbles: true
|
|
26
28
|
});
|
|
27
29
|
Object.defineProperty(syntheticEvent, 'target', {
|
|
@@ -34,22 +36,24 @@ export const makeFocusLockSyntheticEvent = baseEvent => {
|
|
|
34
36
|
});
|
|
35
37
|
return syntheticEvent;
|
|
36
38
|
};
|
|
37
|
-
|
|
39
|
+
var useFocusBorders = function useFocusBorders(React, disabled, trapRef) {
|
|
38
40
|
useUniqueIdHookMock(React);
|
|
39
|
-
React.useEffect(()
|
|
40
|
-
|
|
41
|
+
React.useEffect(function () {
|
|
42
|
+
var trapNode = trapRef === null || trapRef === void 0 ? void 0 : trapRef.current;
|
|
41
43
|
if (trapNode && !disabled && getFocusableIn(trapNode).length > 0) {
|
|
42
44
|
addFocusBorders(trapNode);
|
|
43
45
|
}
|
|
44
|
-
return ()
|
|
46
|
+
return function () {
|
|
45
47
|
if (trapNode) {
|
|
46
48
|
removeFocusBorders(trapNode);
|
|
47
49
|
}
|
|
48
50
|
};
|
|
49
51
|
}, [disabled]);
|
|
50
52
|
};
|
|
51
|
-
|
|
52
|
-
|
|
53
|
+
var uniqueId = 0;
|
|
54
|
+
var getUniqueId = function getUniqueId(prefix) {
|
|
55
|
+
return "".concat(prefix, "-").concat(Math.random().toString(36).slice(2), "-").concat(uniqueId++);
|
|
56
|
+
};
|
|
53
57
|
|
|
54
58
|
/**
|
|
55
59
|
* # Focus lock hook merging
|
|
@@ -82,10 +86,10 @@ const getUniqueId = prefix => `${prefix}-${Math.random().toString(36).slice(2)}-
|
|
|
82
86
|
* If new update requires to remove some hooks – add mocks instead of them.
|
|
83
87
|
* If new update requires to add some hooks and no workaround with current hooks list is possible – probably focus lock hook key should be changed.
|
|
84
88
|
*/
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
+
var focusLockVersion = 5;
|
|
90
|
+
var globalFocusLockHookKey = '__intergalactic_focus_lock_hook_react_v_respectful';
|
|
91
|
+
var focusLockAllTraps = new Set();
|
|
92
|
+
var focusLockUsedInMountedComponents = new Set();
|
|
89
93
|
/** Focus master is a special mode in which focus lock might work.
|
|
90
94
|
* Normally, focus lock hook allows user focus to move freely between
|
|
91
95
|
* all active focus traps. When component provides `focusMaster=true`
|
|
@@ -94,81 +98,86 @@ const focusLockUsedInMountedComponents = new Set();
|
|
|
94
98
|
* also have some visual backdrop.
|
|
95
99
|
* The last element in focus masters stack is considered as a current focus master.
|
|
96
100
|
*/
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
101
|
+
var focusMastersStack = [];
|
|
102
|
+
var noop = function noop() {};
|
|
103
|
+
var useUniqueIdHookMock = function useUniqueIdHookMock(React) {
|
|
100
104
|
React.useState(undefined);
|
|
101
|
-
|
|
105
|
+
var useEnhancedEffect = canUseDOM() ? React.useLayoutEffect : React.useEffect;
|
|
102
106
|
useEnhancedEffect(noop, []);
|
|
103
107
|
};
|
|
104
|
-
|
|
108
|
+
var useFocusLockHook = function useFocusLockHook(React, trapRef, autoFocus, returnFocusTo) {
|
|
109
|
+
var disabled = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
|
|
110
|
+
var focusMaster = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false;
|
|
111
|
+
var onFocusOut = arguments.length > 6 ? arguments[6] : undefined;
|
|
105
112
|
useFocusBorders(React, disabled, trapRef);
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
setTimeout(()
|
|
113
|
+
var autoTriggerRef = React.useRef(null);
|
|
114
|
+
var lastUserInteractionRef = React.useRef(undefined);
|
|
115
|
+
var handleFocusOut = React.useCallback(function (event) {
|
|
116
|
+
var focusCameFrom = event.target;
|
|
117
|
+
var focusMovedTo = event.relatedTarget;
|
|
118
|
+
setTimeout(function () {
|
|
112
119
|
if (!focusCameFrom) return;
|
|
113
120
|
if (autoTriggerRef.current) return;
|
|
114
121
|
autoTriggerRef.current = focusCameFrom;
|
|
115
122
|
}, 0);
|
|
116
123
|
if (lastUserInteractionRef.current === 'mouse') return;
|
|
117
|
-
Promise.resolve().then(()
|
|
124
|
+
Promise.resolve().then(function () {
|
|
118
125
|
if (!trapRef.current) return;
|
|
119
|
-
|
|
126
|
+
var currentFocusMaster = focusMastersStack[focusMastersStack.length - 1];
|
|
120
127
|
if (currentFocusMaster && currentFocusMaster !== trapRef.current) return;
|
|
121
|
-
|
|
128
|
+
var trapNodes = currentFocusMaster ? [trapRef.current] : [trapRef.current].concat(_toConsumableArray(focusLockAllTraps));
|
|
122
129
|
if (isFocusInside(trapNodes, focusMovedTo)) return;
|
|
123
|
-
if (
|
|
130
|
+
if (_typeof(returnFocusTo) === 'object' && returnFocusTo !== null && returnFocusTo !== void 0 && returnFocusTo.current && hasParent(focusMovedTo, returnFocusTo.current)) return;
|
|
124
131
|
if (focusCameFrom && focusMovedTo) {
|
|
125
132
|
setFocus(trapRef.current, focusCameFrom, focusMovedTo);
|
|
126
133
|
}
|
|
127
|
-
onFocusOut
|
|
134
|
+
onFocusOut === null || onFocusOut === void 0 || onFocusOut(event);
|
|
128
135
|
});
|
|
129
136
|
}, [onFocusOut]);
|
|
130
|
-
|
|
137
|
+
var handleMouseEvent = React.useCallback(function () {
|
|
131
138
|
lastUserInteractionRef.current = 'mouse';
|
|
132
139
|
}, []);
|
|
133
|
-
|
|
140
|
+
var handleKeyboardEvent = React.useCallback(function () {
|
|
134
141
|
lastUserInteractionRef.current = 'keyboard';
|
|
135
142
|
}, []);
|
|
136
|
-
|
|
137
|
-
|
|
143
|
+
var returnFocus = React.useCallback(function () {
|
|
144
|
+
var trapNode = trapRef.current;
|
|
138
145
|
if (trapNode && !isFocusInside(trapNode)) return;
|
|
139
|
-
|
|
140
|
-
if (
|
|
141
|
-
|
|
142
|
-
setTimeout(()
|
|
146
|
+
var focusMastersStackCount = focusMastersStack.length;
|
|
147
|
+
if (_typeof(returnFocusTo) === 'object' && returnFocusTo !== null && returnFocusTo !== void 0 && returnFocusTo.current) {
|
|
148
|
+
var returnFocusNode = returnFocusTo === null || returnFocusTo === void 0 ? void 0 : returnFocusTo.current;
|
|
149
|
+
setTimeout(function () {
|
|
143
150
|
if (focusMastersStackCount !== focusMastersStack.length) {
|
|
144
151
|
setFocus(returnFocusNode, trapNode);
|
|
145
152
|
}
|
|
146
153
|
}, 0);
|
|
147
154
|
}
|
|
148
155
|
if (returnFocusTo === 'auto' && autoTriggerRef.current) {
|
|
149
|
-
|
|
150
|
-
setTimeout(()
|
|
156
|
+
var autoTrigger = autoTriggerRef.current;
|
|
157
|
+
setTimeout(function () {
|
|
151
158
|
if (focusMastersStackCount !== focusMastersStack.length || autoFocus === 'enforced') {
|
|
152
159
|
setFocus(autoTrigger, trapNode);
|
|
153
160
|
}
|
|
154
161
|
}, 0);
|
|
155
162
|
}
|
|
156
163
|
}, [returnFocusTo]);
|
|
157
|
-
React.useEffect(()
|
|
158
|
-
if (
|
|
159
|
-
|
|
164
|
+
React.useEffect(function () {
|
|
165
|
+
if (_typeof(trapRef) !== 'object' || trapRef === null) return;
|
|
166
|
+
var node = trapRef.current;
|
|
160
167
|
if (!node) return;
|
|
161
168
|
focusLockAllTraps.add(node);
|
|
162
|
-
return ()
|
|
169
|
+
return function () {
|
|
163
170
|
if (!node) return;
|
|
164
|
-
focusLockAllTraps
|
|
171
|
+
focusLockAllTraps["delete"](node);
|
|
165
172
|
};
|
|
166
173
|
}, [disabled]);
|
|
167
|
-
React.useEffect(()
|
|
174
|
+
React.useEffect(function () {
|
|
168
175
|
if (disabled) return;
|
|
169
176
|
if (!canUseDOM()) return;
|
|
170
177
|
if (!trapRef.current) return;
|
|
171
|
-
|
|
178
|
+
var focusableChildren = Array.from(trapRef.current.children).flatMap(function (node) {
|
|
179
|
+
return getFocusableIn(node);
|
|
180
|
+
});
|
|
172
181
|
if (focusableChildren.length === 0 && autoFocus !== 'enforced') return;
|
|
173
182
|
document.body.addEventListener('focusout', handleFocusOut);
|
|
174
183
|
document.body.addEventListener(syntheticEvents.blur, handleFocusOut);
|
|
@@ -177,15 +186,16 @@ const useFocusLockHook = (React, trapRef, autoFocus, returnFocusTo, disabled = f
|
|
|
177
186
|
document.body.addEventListener('keydown', handleKeyboardEvent);
|
|
178
187
|
document.body.addEventListener(syntheticEvents.keydown, handleKeyboardEvent);
|
|
179
188
|
if (autoFocus) {
|
|
180
|
-
setTimeout(()
|
|
189
|
+
setTimeout(function () {
|
|
181
190
|
if (autoFocus === 'enforced' && focusableChildren.length === 0 && focusMaster) {
|
|
182
|
-
|
|
191
|
+
var _trapRef$current;
|
|
192
|
+
(_trapRef$current = trapRef.current) === null || _trapRef$current === void 0 || _trapRef$current.focus();
|
|
183
193
|
return;
|
|
184
194
|
}
|
|
185
|
-
setFocus(trapRef.current,
|
|
195
|
+
setFocus(trapRef.current, _typeof(returnFocusTo) === 'object' ? returnFocusTo === null || returnFocusTo === void 0 ? void 0 : returnFocusTo.current : document.body);
|
|
186
196
|
}, 0);
|
|
187
197
|
}
|
|
188
|
-
return ()
|
|
198
|
+
return function () {
|
|
189
199
|
document.body.removeEventListener('focusout', handleFocusOut);
|
|
190
200
|
document.body.removeEventListener(syntheticEvents.blur, handleFocusOut);
|
|
191
201
|
document.body.removeEventListener('mousedown', handleMouseEvent);
|
|
@@ -196,17 +206,19 @@ const useFocusLockHook = (React, trapRef, autoFocus, returnFocusTo, disabled = f
|
|
|
196
206
|
autoTriggerRef.current = null;
|
|
197
207
|
};
|
|
198
208
|
}, [disabled, autoFocus, returnFocusTo, returnFocus]);
|
|
199
|
-
React.useEffect(()
|
|
200
|
-
if (
|
|
209
|
+
React.useEffect(function () {
|
|
210
|
+
if (_typeof(trapRef) !== 'object' || trapRef === null) return;
|
|
201
211
|
if (disabled) return;
|
|
202
212
|
if (!canUseDOM()) return;
|
|
203
213
|
if (!trapRef.current) return;
|
|
204
|
-
|
|
214
|
+
var focusableChildren = Array.from(trapRef.current.children).flatMap(function (node) {
|
|
215
|
+
return getFocusableIn(node);
|
|
216
|
+
});
|
|
205
217
|
if (focusableChildren.length === 0) return;
|
|
206
218
|
if (focusMaster) {
|
|
207
219
|
focusMastersStack.push(trapRef.current);
|
|
208
220
|
}
|
|
209
|
-
return ()
|
|
221
|
+
return function () {
|
|
210
222
|
if (!focusMaster) return;
|
|
211
223
|
if (focusMastersStack[focusMastersStack.length - 1] === trapRef.current) {
|
|
212
224
|
focusMastersStack.pop();
|
|
@@ -216,16 +228,16 @@ const useFocusLockHook = (React, trapRef, autoFocus, returnFocusTo, disabled = f
|
|
|
216
228
|
};
|
|
217
229
|
}, [disabled, focusMaster]);
|
|
218
230
|
useUniqueIdHookMock(React);
|
|
219
|
-
React.useEffect(()
|
|
220
|
-
|
|
231
|
+
React.useEffect(function () {
|
|
232
|
+
var id = getUniqueId('focus-lock-consumer');
|
|
221
233
|
if (disabled) return;
|
|
222
234
|
focusLockUsedInMountedComponents.add(id);
|
|
223
|
-
return ()
|
|
224
|
-
focusLockUsedInMountedComponents
|
|
235
|
+
return function () {
|
|
236
|
+
focusLockUsedInMountedComponents["delete"](id);
|
|
225
237
|
};
|
|
226
238
|
}, [disabled]);
|
|
227
239
|
};
|
|
228
|
-
|
|
240
|
+
var establishHookAsGlobal = function establishHookAsGlobal() {
|
|
229
241
|
globalThis[globalFocusLockHookKey] = {
|
|
230
242
|
hook: useFocusLockHook,
|
|
231
243
|
version: focusLockVersion,
|
|
@@ -237,19 +249,24 @@ if (!globalThis[globalFocusLockHookKey]) {
|
|
|
237
249
|
} else if (typeof globalThis[globalFocusLockHookKey].version !== 'number') {
|
|
238
250
|
establishHookAsGlobal();
|
|
239
251
|
} else {
|
|
240
|
-
|
|
241
|
-
version
|
|
242
|
-
usedInComponents
|
|
243
|
-
} = globalThis[globalFocusLockHookKey];
|
|
252
|
+
var _globalFocusLockHookK = globalThis[globalFocusLockHookKey],
|
|
253
|
+
theirVersion = _globalFocusLockHookK.version,
|
|
254
|
+
usedInComponents = _globalFocusLockHookK.usedInComponents;
|
|
244
255
|
if (focusLockVersion > theirVersion && usedInComponents.size === 0) {
|
|
245
256
|
establishHookAsGlobal();
|
|
246
257
|
}
|
|
247
258
|
}
|
|
248
|
-
export
|
|
249
|
-
|
|
259
|
+
export var useFocusLock = function useFocusLock(trapRef, autoFocus, returnFocusTo) {
|
|
260
|
+
var _globalFocusLockHookK2, _globalFocusLockHookK3;
|
|
261
|
+
var disabled = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
|
|
262
|
+
var focusMaster = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
|
|
263
|
+
var onFocusOut = arguments.length > 5 ? arguments[5] : undefined;
|
|
264
|
+
var hook = (_globalFocusLockHookK2 = (_globalFocusLockHookK3 = globalThis[globalFocusLockHookKey]) === null || _globalFocusLockHookK3 === void 0 ? void 0 : _globalFocusLockHookK3.hook) !== null && _globalFocusLockHookK2 !== void 0 ? _globalFocusLockHookK2 : useFocusLockHook;
|
|
250
265
|
return hook(LocalReact, trapRef, autoFocus, returnFocusTo, disabled, focusMaster, onFocusOut);
|
|
251
266
|
};
|
|
252
|
-
export
|
|
253
|
-
return Array.from(element.children).flatMap(
|
|
267
|
+
export var hasFocusableIn = function hasFocusableIn(element) {
|
|
268
|
+
return Array.from(element.children).flatMap(function (node) {
|
|
269
|
+
return getFocusableIn(node);
|
|
270
|
+
}).length > 0;
|
|
254
271
|
};
|
|
255
272
|
//# sourceMappingURL=useFocusLock.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useFocusLock.mjs","names":["LocalReact","canUseDOM","addFocusBorders","removeFocusBorders","getFocusableIn","isFocusInside","setFocus","hasParent","syntheticEvents","blur","keydown","makeFocusLockSyntheticEvent","baseEvent","event","type","supported","Object","keys","join","Error","syntheticEvent","Event","bubbles","defineProperty","writable","value","target","relatedTarget","useFocusBorders","React","disabled","trapRef","useUniqueIdHookMock","useEffect","trapNode","current","length","uniqueId","getUniqueId","prefix","Math","random","toString","slice","focusLockVersion","globalFocusLockHookKey","focusLockAllTraps","Set","focusLockUsedInMountedComponents","focusMastersStack","noop","useState","undefined","useEnhancedEffect","useLayoutEffect","useFocusLockHook","autoFocus","returnFocusTo","focusMaster","onFocusOut","autoTriggerRef","useRef","lastUserInteractionRef","handleFocusOut","useCallback","focusCameFrom","focusMovedTo","setTimeout","Promise","resolve","then","currentFocusMaster","trapNodes","handleMouseEvent","handleKeyboardEvent","returnFocus","focusMastersStackCount","returnFocusNode","autoTrigger","node","add","delete","focusableChildren","Array","from","children","flatMap","document","body","addEventListener","focus","removeEventListener","push","pop","splice","indexOf","id","establishHookAsGlobal","globalThis","hook","version","usedInComponents","theirVersion","size","useFocusLock","hasFocusableIn","element"],"sources":["../../../src/utils/use/useFocusLock.ts"],"sourcesContent":["import LocalReact from 'react';\n\nimport canUseDOM from '../canUseDOM';\nimport { addFocusBorders, removeFocusBorders } from '../focus-lock/focusBorders';\nimport { getFocusableIn } from '../focus-lock/getFocusableIn';\nimport { isFocusInside } from '../focus-lock/isFocusInside';\nimport { setFocus } from '../focus-lock/setFocus';\nimport { hasParent } from '../hasParent';\n\nexport { isFocusInside, setFocus };\n\nconst syntheticEvents = {\n blur: 'focusout-intergalactic-focus-lock-synthetic',\n keydown: 'keydown-intergalactic-focus-lock-synthetic',\n};\n/**\n * Synthetic event are special events that always bypass all propagation guards and reaches focus lock event listeners.\n * You should always prevent native event propagation in order to prevent focus enforcing double calls.\n */\nexport const makeFocusLockSyntheticEvent = (baseEvent: Event) => {\n const event = baseEvent as any;\n const type = event.type as keyof typeof syntheticEvents;\n if (!(type in syntheticEvents)) {\n const supported = Object.keys(syntheticEvents).join(', ');\n throw new Error(`Unable to make synthetic event for ${type}, ${supported} are supported`);\n }\n const syntheticEvent = new Event(syntheticEvents[type], {\n bubbles: true,\n });\n Object.defineProperty(syntheticEvent, 'target', { writable: false, value: event.target });\n Object.defineProperty(syntheticEvent, 'relatedTarget', {\n writable: false,\n value: event.relatedTarget,\n });\n return syntheticEvent;\n};\n\nconst useFocusBorders = (\n React: ReactT,\n disabled?: boolean,\n trapRef?: React.RefObject<HTMLElement>,\n) => {\n useUniqueIdHookMock(React);\n React.useEffect(() => {\n const trapNode = trapRef?.current;\n\n if (trapNode && !disabled && getFocusableIn(trapNode).length > 0) {\n addFocusBorders(trapNode);\n }\n\n return () => {\n if (trapNode) {\n removeFocusBorders(trapNode);\n }\n };\n }, [disabled]);\n};\n\ntype ReactT = typeof LocalReact;\n\nlet uniqueId = 0;\nconst getUniqueId = (prefix: string) =>\n `${prefix}-${Math.random().toString(36).slice(2)}-${uniqueId++}`;\n\n/**\n * # Focus lock hook merging\n * In some cases same page might contain different versions of components.\n * In such cases, we need to ensure that only one version of focus lock hook is used.\n * So, it's why we have `useFocusLockHook` function that is wrapped into `useFocusLock`.\n *\n * While evaluating this file code, we check if global focus lock hook is already defined.\n * If it's defined, we replace it ONLY if our version is higher and no components currently use it.\n * The last condition is very important because we are unable to replace React hook without reimplementing\n * React hooks lifecycle in some kind of wrapper.\n *\n * ## Versioning\n * Such versions merging requires us to keep hook api backward compatible.\n * When hook logic changes, the variable `focusLockVersion` should be incremented.\n *\n * Version update `1 -> 2`. Fixed call `safeMoveFocusInside` in `handleFocusIn` with correct second parameter (focusCameFrom instead of event.target)\n * Version update `2 -> 3`. Fixed React version isolation in nested hooks (`useFocusBorders`, `useUniqueId`).\n * Version update `3 -> 4`. Fixed lock for correct working with iframes in modal\n * Version update `4 -> 5`. Changed placements for border - now they wrap trap node\n *\n * Initially (for a several versions) key was `__intergalactic_focus_lock_hook_`.\n * Making it respect react version required to change key. So key was changed to `__intergalactic_focus_lock_hook_react_v_respectful`.\n *\n * ## React hooks order\n * When updating from version 2 to version 3 `useUniqueId` hook was removed.\n * Due to replacing useFocusLock hook in runtime, the order of hooks must be preserved.\n * So, useUniqueIdHookMock helps to preserve hooks order when hook is being replaced from version 2 to version 3.\n *\n * If new update requires to remove some hooks – add mocks instead of them.\n * If new update requires to add some hooks and no workaround with current hooks list is possible – probably focus lock hook key should be changed.\n */\nconst focusLockVersion = 5;\nconst globalFocusLockHookKey = '__intergalactic_focus_lock_hook_react_v_respectful';\n\nconst focusLockAllTraps = new Set<HTMLElement>();\nconst focusLockUsedInMountedComponents = new Set<string>();\n/** Focus master is a special mode in which focus lock might work.\n * Normally, focus lock hook allows user focus to move freely between\n * all active focus traps. When component provides `focusMaster=true`\n * parameter, it says that it doesn't want to share focus with other traps.\n * It is very useful for a big components like modals or side-bars that\n * also have some visual backdrop.\n * The last element in focus masters stack is considered as a current focus master.\n */\nconst focusMastersStack: HTMLElement[] = [];\n\nconst noop = () => {};\nconst useUniqueIdHookMock = (React: ReactT) => {\n React.useState(undefined);\n const useEnhancedEffect = canUseDOM() ? React.useLayoutEffect : React.useEffect;\n useEnhancedEffect(noop, []);\n};\n\nconst useFocusLockHook = (\n React: ReactT,\n trapRef: React.RefObject<HTMLElement>,\n autoFocus: boolean | 'enforced',\n returnFocusTo: React.RefObject<HTMLElement> | null | 'auto',\n disabled = false,\n focusMaster = false,\n onFocusOut?: (event: Event) => void,\n) => {\n useFocusBorders(React, disabled, trapRef);\n\n const autoTriggerRef = React.useRef<HTMLElement | null>(null);\n const lastUserInteractionRef = React.useRef<'mouse' | 'keyboard' | undefined>(undefined);\n\n const handleFocusOut = React.useCallback(\n (event: Event & { relatedTarget?: HTMLElement; target?: HTMLElement }) => {\n const focusCameFrom = event.target;\n const focusMovedTo = event.relatedTarget;\n setTimeout(() => {\n if (!focusCameFrom) return;\n if (autoTriggerRef.current) return;\n autoTriggerRef.current = focusCameFrom;\n }, 0);\n if (lastUserInteractionRef.current === 'mouse') return;\n Promise.resolve().then(() => {\n if (!trapRef.current) return;\n const currentFocusMaster = focusMastersStack[focusMastersStack.length - 1];\n if (currentFocusMaster && currentFocusMaster !== trapRef.current) return;\n const trapNodes = currentFocusMaster\n ? [trapRef.current]\n : [trapRef.current, ...focusLockAllTraps];\n if (isFocusInside(trapNodes, focusMovedTo)) return;\n if (\n typeof returnFocusTo === 'object' &&\n returnFocusTo?.current &&\n hasParent(focusMovedTo, returnFocusTo.current)\n )\n return;\n\n if (focusCameFrom && focusMovedTo) {\n setFocus(trapRef.current, focusCameFrom, focusMovedTo);\n }\n\n onFocusOut?.(event);\n });\n },\n [onFocusOut],\n );\n const handleMouseEvent = React.useCallback(() => {\n lastUserInteractionRef.current = 'mouse';\n }, []);\n const handleKeyboardEvent = React.useCallback(() => {\n lastUserInteractionRef.current = 'keyboard';\n }, []);\n const returnFocus = React.useCallback(() => {\n const trapNode = trapRef.current;\n if (trapNode && !isFocusInside(trapNode)) return;\n const focusMastersStackCount = focusMastersStack.length;\n if (typeof returnFocusTo === 'object' && returnFocusTo?.current) {\n const returnFocusNode = returnFocusTo?.current;\n setTimeout(() => {\n if (focusMastersStackCount !== focusMastersStack.length) {\n setFocus(returnFocusNode, trapNode);\n }\n }, 0);\n }\n if (returnFocusTo === 'auto' && autoTriggerRef.current) {\n const autoTrigger = autoTriggerRef.current;\n setTimeout(() => {\n if (focusMastersStackCount !== focusMastersStack.length || autoFocus === 'enforced') {\n setFocus(autoTrigger, trapNode);\n }\n }, 0);\n }\n }, [returnFocusTo]);\n React.useEffect(() => {\n if (typeof trapRef !== 'object' || trapRef === null) return;\n const node = trapRef.current;\n if (!node) return;\n focusLockAllTraps.add(node);\n return () => {\n if (!node) return;\n focusLockAllTraps.delete(node);\n };\n }, [disabled]);\n\n React.useEffect(() => {\n if (disabled) return;\n if (!canUseDOM()) return;\n if (!trapRef.current) return;\n const focusableChildren = Array.from(trapRef.current.children).flatMap((node) =>\n getFocusableIn(node as HTMLElement),\n );\n if (focusableChildren.length === 0 && autoFocus !== 'enforced') return;\n\n document.body.addEventListener('focusout', handleFocusOut as any);\n document.body.addEventListener(syntheticEvents.blur, handleFocusOut as any);\n document.body.addEventListener('mousedown', handleMouseEvent);\n document.body.addEventListener('touchstart', handleMouseEvent);\n document.body.addEventListener('keydown', handleKeyboardEvent);\n document.body.addEventListener(syntheticEvents.keydown, handleKeyboardEvent);\n\n if (autoFocus) {\n setTimeout(() => {\n if (autoFocus === 'enforced' && focusableChildren.length === 0 && focusMaster) {\n trapRef.current?.focus();\n return;\n }\n\n setFocus(\n trapRef.current!,\n typeof returnFocusTo === 'object' ? returnFocusTo?.current : document.body,\n );\n }, 0);\n }\n return () => {\n document.body.removeEventListener('focusout', handleFocusOut as any);\n document.body.removeEventListener(syntheticEvents.blur, handleFocusOut as any);\n document.body.removeEventListener('mousedown', handleMouseEvent);\n document.body.removeEventListener('touchstart', handleMouseEvent);\n document.body.removeEventListener('keydown', handleKeyboardEvent);\n document.body.removeEventListener(syntheticEvents.keydown, handleKeyboardEvent);\n returnFocus();\n autoTriggerRef.current = null;\n };\n }, [disabled, autoFocus, returnFocusTo, returnFocus]);\n\n React.useEffect(() => {\n if (typeof trapRef !== 'object' || trapRef === null) return;\n if (disabled) return;\n if (!canUseDOM()) return;\n if (!trapRef.current) return;\n const focusableChildren = Array.from(trapRef.current.children).flatMap((node) =>\n getFocusableIn(node as HTMLElement),\n );\n if (focusableChildren.length === 0) return;\n\n if (focusMaster) {\n focusMastersStack.push(trapRef.current);\n }\n\n return () => {\n if (!focusMaster) return;\n if (focusMastersStack[focusMastersStack.length - 1] === trapRef.current) {\n focusMastersStack.pop();\n } else {\n focusMastersStack.splice(focusMastersStack.indexOf(trapRef.current!), 1);\n }\n };\n }, [disabled, focusMaster]);\n\n useUniqueIdHookMock(React);\n React.useEffect(() => {\n const id = getUniqueId('focus-lock-consumer');\n if (disabled) return;\n focusLockUsedInMountedComponents.add(id);\n return () => {\n focusLockUsedInMountedComponents.delete(id);\n };\n }, [disabled]);\n};\nconst establishHookAsGlobal = () => {\n (globalThis as any)[globalFocusLockHookKey] = {\n hook: useFocusLockHook,\n version: focusLockVersion,\n usedInComponents: focusLockUsedInMountedComponents,\n };\n};\nif (!(globalThis as any)[globalFocusLockHookKey]) {\n establishHookAsGlobal();\n} else if (typeof (globalThis as any)[globalFocusLockHookKey].version !== 'number') {\n establishHookAsGlobal();\n} else {\n const { version: theirVersion, usedInComponents } = (globalThis as any)[globalFocusLockHookKey];\n if (focusLockVersion > theirVersion && usedInComponents.size === 0) {\n establishHookAsGlobal();\n }\n}\n\nexport const useFocusLock = (\n trapRef: React.RefObject<HTMLElement>,\n autoFocus: boolean | 'enforced',\n returnFocusTo: React.RefObject<HTMLElement> | null | 'auto',\n disabled = false,\n focusMaster = false,\n onFocusOut?: (event: Event) => void,\n) => {\n const hook = (globalThis as any)[globalFocusLockHookKey]?.hook ?? useFocusLockHook;\n return hook(LocalReact, trapRef, autoFocus, returnFocusTo, disabled, focusMaster, onFocusOut);\n};\n\nexport const hasFocusableIn = (element: HTMLElement): boolean => {\n return (\n Array.from(element.children).flatMap((node) => getFocusableIn(node as HTMLElement)).length > 0\n );\n};\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"useFocusLock.mjs","names":["LocalReact","canUseDOM","addFocusBorders","removeFocusBorders","getFocusableIn","isFocusInside","setFocus","hasParent","syntheticEvents","blur","keydown","makeFocusLockSyntheticEvent","baseEvent","event","type","supported","Object","keys","join","Error","concat","syntheticEvent","Event","bubbles","defineProperty","writable","value","target","relatedTarget","useFocusBorders","React","disabled","trapRef","useUniqueIdHookMock","useEffect","trapNode","current","length","uniqueId","getUniqueId","prefix","Math","random","toString","slice","focusLockVersion","globalFocusLockHookKey","focusLockAllTraps","Set","focusLockUsedInMountedComponents","focusMastersStack","noop","useState","undefined","useEnhancedEffect","useLayoutEffect","useFocusLockHook","autoFocus","returnFocusTo","arguments","focusMaster","onFocusOut","autoTriggerRef","useRef","lastUserInteractionRef","handleFocusOut","useCallback","focusCameFrom","focusMovedTo","setTimeout","Promise","resolve","then","currentFocusMaster","trapNodes","_toConsumableArray","_typeof","handleMouseEvent","handleKeyboardEvent","returnFocus","focusMastersStackCount","returnFocusNode","autoTrigger","node","add","focusableChildren","Array","from","children","flatMap","document","body","addEventListener","_trapRef$current","focus","removeEventListener","push","pop","splice","indexOf","id","establishHookAsGlobal","globalThis","hook","version","usedInComponents","_globalFocusLockHookK","theirVersion","size","useFocusLock","_globalFocusLockHookK2","_globalFocusLockHookK3","hasFocusableIn","element"],"sources":["../../../src/utils/use/useFocusLock.ts"],"sourcesContent":["import LocalReact from 'react';\n\nimport canUseDOM from '../canUseDOM';\nimport { addFocusBorders, removeFocusBorders } from '../focus-lock/focusBorders';\nimport { getFocusableIn } from '../focus-lock/getFocusableIn';\nimport { isFocusInside } from '../focus-lock/isFocusInside';\nimport { setFocus } from '../focus-lock/setFocus';\nimport { hasParent } from '../hasParent';\n\nexport { isFocusInside, setFocus };\n\nconst syntheticEvents = {\n blur: 'focusout-intergalactic-focus-lock-synthetic',\n keydown: 'keydown-intergalactic-focus-lock-synthetic',\n};\n/**\n * Synthetic event are special events that always bypass all propagation guards and reaches focus lock event listeners.\n * You should always prevent native event propagation in order to prevent focus enforcing double calls.\n */\nexport const makeFocusLockSyntheticEvent = (baseEvent: Event) => {\n const event = baseEvent as any;\n const type = event.type as keyof typeof syntheticEvents;\n if (!(type in syntheticEvents)) {\n const supported = Object.keys(syntheticEvents).join(', ');\n throw new Error(`Unable to make synthetic event for ${type}, ${supported} are supported`);\n }\n const syntheticEvent = new Event(syntheticEvents[type], {\n bubbles: true,\n });\n Object.defineProperty(syntheticEvent, 'target', { writable: false, value: event.target });\n Object.defineProperty(syntheticEvent, 'relatedTarget', {\n writable: false,\n value: event.relatedTarget,\n });\n return syntheticEvent;\n};\n\nconst useFocusBorders = (\n React: ReactT,\n disabled?: boolean,\n trapRef?: React.RefObject<HTMLElement>,\n) => {\n useUniqueIdHookMock(React);\n React.useEffect(() => {\n const trapNode = trapRef?.current;\n\n if (trapNode && !disabled && getFocusableIn(trapNode).length > 0) {\n addFocusBorders(trapNode);\n }\n\n return () => {\n if (trapNode) {\n removeFocusBorders(trapNode);\n }\n };\n }, [disabled]);\n};\n\ntype ReactT = typeof LocalReact;\n\nlet uniqueId = 0;\nconst getUniqueId = (prefix: string) =>\n `${prefix}-${Math.random().toString(36).slice(2)}-${uniqueId++}`;\n\n/**\n * # Focus lock hook merging\n * In some cases same page might contain different versions of components.\n * In such cases, we need to ensure that only one version of focus lock hook is used.\n * So, it's why we have `useFocusLockHook` function that is wrapped into `useFocusLock`.\n *\n * While evaluating this file code, we check if global focus lock hook is already defined.\n * If it's defined, we replace it ONLY if our version is higher and no components currently use it.\n * The last condition is very important because we are unable to replace React hook without reimplementing\n * React hooks lifecycle in some kind of wrapper.\n *\n * ## Versioning\n * Such versions merging requires us to keep hook api backward compatible.\n * When hook logic changes, the variable `focusLockVersion` should be incremented.\n *\n * Version update `1 -> 2`. Fixed call `safeMoveFocusInside` in `handleFocusIn` with correct second parameter (focusCameFrom instead of event.target)\n * Version update `2 -> 3`. Fixed React version isolation in nested hooks (`useFocusBorders`, `useUniqueId`).\n * Version update `3 -> 4`. Fixed lock for correct working with iframes in modal\n * Version update `4 -> 5`. Changed placements for border - now they wrap trap node\n *\n * Initially (for a several versions) key was `__intergalactic_focus_lock_hook_`.\n * Making it respect react version required to change key. So key was changed to `__intergalactic_focus_lock_hook_react_v_respectful`.\n *\n * ## React hooks order\n * When updating from version 2 to version 3 `useUniqueId` hook was removed.\n * Due to replacing useFocusLock hook in runtime, the order of hooks must be preserved.\n * So, useUniqueIdHookMock helps to preserve hooks order when hook is being replaced from version 2 to version 3.\n *\n * If new update requires to remove some hooks – add mocks instead of them.\n * If new update requires to add some hooks and no workaround with current hooks list is possible – probably focus lock hook key should be changed.\n */\nconst focusLockVersion = 5;\nconst globalFocusLockHookKey = '__intergalactic_focus_lock_hook_react_v_respectful';\n\nconst focusLockAllTraps = new Set<HTMLElement>();\nconst focusLockUsedInMountedComponents = new Set<string>();\n/** Focus master is a special mode in which focus lock might work.\n * Normally, focus lock hook allows user focus to move freely between\n * all active focus traps. When component provides `focusMaster=true`\n * parameter, it says that it doesn't want to share focus with other traps.\n * It is very useful for a big components like modals or side-bars that\n * also have some visual backdrop.\n * The last element in focus masters stack is considered as a current focus master.\n */\nconst focusMastersStack: HTMLElement[] = [];\n\nconst noop = () => {};\nconst useUniqueIdHookMock = (React: ReactT) => {\n React.useState(undefined);\n const useEnhancedEffect = canUseDOM() ? React.useLayoutEffect : React.useEffect;\n useEnhancedEffect(noop, []);\n};\n\nconst useFocusLockHook = (\n React: ReactT,\n trapRef: React.RefObject<HTMLElement>,\n autoFocus: boolean | 'enforced',\n returnFocusTo: React.RefObject<HTMLElement> | null | 'auto',\n disabled = false,\n focusMaster = false,\n onFocusOut?: (event: Event) => void,\n) => {\n useFocusBorders(React, disabled, trapRef);\n\n const autoTriggerRef = React.useRef<HTMLElement | null>(null);\n const lastUserInteractionRef = React.useRef<'mouse' | 'keyboard' | undefined>(undefined);\n\n const handleFocusOut = React.useCallback(\n (event: Event & { relatedTarget?: HTMLElement; target?: HTMLElement }) => {\n const focusCameFrom = event.target;\n const focusMovedTo = event.relatedTarget;\n setTimeout(() => {\n if (!focusCameFrom) return;\n if (autoTriggerRef.current) return;\n autoTriggerRef.current = focusCameFrom;\n }, 0);\n if (lastUserInteractionRef.current === 'mouse') return;\n Promise.resolve().then(() => {\n if (!trapRef.current) return;\n const currentFocusMaster = focusMastersStack[focusMastersStack.length - 1];\n if (currentFocusMaster && currentFocusMaster !== trapRef.current) return;\n const trapNodes = currentFocusMaster\n ? [trapRef.current]\n : [trapRef.current, ...focusLockAllTraps];\n if (isFocusInside(trapNodes, focusMovedTo)) return;\n if (\n typeof returnFocusTo === 'object' &&\n returnFocusTo?.current &&\n hasParent(focusMovedTo, returnFocusTo.current)\n )\n return;\n\n if (focusCameFrom && focusMovedTo) {\n setFocus(trapRef.current, focusCameFrom, focusMovedTo);\n }\n\n onFocusOut?.(event);\n });\n },\n [onFocusOut],\n );\n const handleMouseEvent = React.useCallback(() => {\n lastUserInteractionRef.current = 'mouse';\n }, []);\n const handleKeyboardEvent = React.useCallback(() => {\n lastUserInteractionRef.current = 'keyboard';\n }, []);\n const returnFocus = React.useCallback(() => {\n const trapNode = trapRef.current;\n if (trapNode && !isFocusInside(trapNode)) return;\n const focusMastersStackCount = focusMastersStack.length;\n if (typeof returnFocusTo === 'object' && returnFocusTo?.current) {\n const returnFocusNode = returnFocusTo?.current;\n setTimeout(() => {\n if (focusMastersStackCount !== focusMastersStack.length) {\n setFocus(returnFocusNode, trapNode);\n }\n }, 0);\n }\n if (returnFocusTo === 'auto' && autoTriggerRef.current) {\n const autoTrigger = autoTriggerRef.current;\n setTimeout(() => {\n if (focusMastersStackCount !== focusMastersStack.length || autoFocus === 'enforced') {\n setFocus(autoTrigger, trapNode);\n }\n }, 0);\n }\n }, [returnFocusTo]);\n React.useEffect(() => {\n if (typeof trapRef !== 'object' || trapRef === null) return;\n const node = trapRef.current;\n if (!node) return;\n focusLockAllTraps.add(node);\n return () => {\n if (!node) return;\n focusLockAllTraps.delete(node);\n };\n }, [disabled]);\n\n React.useEffect(() => {\n if (disabled) return;\n if (!canUseDOM()) return;\n if (!trapRef.current) return;\n const focusableChildren = Array.from(trapRef.current.children).flatMap((node) =>\n getFocusableIn(node as HTMLElement),\n );\n if (focusableChildren.length === 0 && autoFocus !== 'enforced') return;\n\n document.body.addEventListener('focusout', handleFocusOut as any);\n document.body.addEventListener(syntheticEvents.blur, handleFocusOut as any);\n document.body.addEventListener('mousedown', handleMouseEvent);\n document.body.addEventListener('touchstart', handleMouseEvent);\n document.body.addEventListener('keydown', handleKeyboardEvent);\n document.body.addEventListener(syntheticEvents.keydown, handleKeyboardEvent);\n\n if (autoFocus) {\n setTimeout(() => {\n if (autoFocus === 'enforced' && focusableChildren.length === 0 && focusMaster) {\n trapRef.current?.focus();\n return;\n }\n\n setFocus(\n trapRef.current!,\n typeof returnFocusTo === 'object' ? returnFocusTo?.current : document.body,\n );\n }, 0);\n }\n return () => {\n document.body.removeEventListener('focusout', handleFocusOut as any);\n document.body.removeEventListener(syntheticEvents.blur, handleFocusOut as any);\n document.body.removeEventListener('mousedown', handleMouseEvent);\n document.body.removeEventListener('touchstart', handleMouseEvent);\n document.body.removeEventListener('keydown', handleKeyboardEvent);\n document.body.removeEventListener(syntheticEvents.keydown, handleKeyboardEvent);\n returnFocus();\n autoTriggerRef.current = null;\n };\n }, [disabled, autoFocus, returnFocusTo, returnFocus]);\n\n React.useEffect(() => {\n if (typeof trapRef !== 'object' || trapRef === null) return;\n if (disabled) return;\n if (!canUseDOM()) return;\n if (!trapRef.current) return;\n const focusableChildren = Array.from(trapRef.current.children).flatMap((node) =>\n getFocusableIn(node as HTMLElement),\n );\n if (focusableChildren.length === 0) return;\n\n if (focusMaster) {\n focusMastersStack.push(trapRef.current);\n }\n\n return () => {\n if (!focusMaster) return;\n if (focusMastersStack[focusMastersStack.length - 1] === trapRef.current) {\n focusMastersStack.pop();\n } else {\n focusMastersStack.splice(focusMastersStack.indexOf(trapRef.current!), 1);\n }\n };\n }, [disabled, focusMaster]);\n\n useUniqueIdHookMock(React);\n React.useEffect(() => {\n const id = getUniqueId('focus-lock-consumer');\n if (disabled) return;\n focusLockUsedInMountedComponents.add(id);\n return () => {\n focusLockUsedInMountedComponents.delete(id);\n };\n }, [disabled]);\n};\nconst establishHookAsGlobal = () => {\n (globalThis as any)[globalFocusLockHookKey] = {\n hook: useFocusLockHook,\n version: focusLockVersion,\n usedInComponents: focusLockUsedInMountedComponents,\n };\n};\nif (!(globalThis as any)[globalFocusLockHookKey]) {\n establishHookAsGlobal();\n} else if (typeof (globalThis as any)[globalFocusLockHookKey].version !== 'number') {\n establishHookAsGlobal();\n} else {\n const { version: theirVersion, usedInComponents } = (globalThis as any)[globalFocusLockHookKey];\n if (focusLockVersion > theirVersion && usedInComponents.size === 0) {\n establishHookAsGlobal();\n }\n}\n\nexport const useFocusLock = (\n trapRef: React.RefObject<HTMLElement>,\n autoFocus: boolean | 'enforced',\n returnFocusTo: React.RefObject<HTMLElement> | null | 'auto',\n disabled = false,\n focusMaster = false,\n onFocusOut?: (event: Event) => void,\n) => {\n const hook = (globalThis as any)[globalFocusLockHookKey]?.hook ?? useFocusLockHook;\n return hook(LocalReact, trapRef, autoFocus, returnFocusTo, disabled, focusMaster, onFocusOut);\n};\n\nexport const hasFocusableIn = (element: HTMLElement): boolean => {\n return (\n Array.from(element.children).flatMap((node) => getFocusableIn(node as HTMLElement)).length > 0\n );\n};\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,56 +1,58 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
|
|
4
4
|
Object.defineProperty(exports, "__esModule", {
|
|
5
5
|
value: true
|
|
6
6
|
});
|
|
7
|
-
exports
|
|
7
|
+
exports["default"] = usePreventScroll;
|
|
8
8
|
exports.getScrollbarWidth = getScrollbarWidth;
|
|
9
9
|
var _react = _interopRequireDefault(require("react"));
|
|
10
10
|
var _canUseDOM = _interopRequireDefault(require("../canUseDOM"));
|
|
11
11
|
var _uniqueID = require("../uniqueID");
|
|
12
12
|
function getScrollbarWidth() {
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
var _outer$parentNode;
|
|
14
|
+
if (!(0, _canUseDOM["default"])()) return 0;
|
|
15
|
+
var outer = document.createElement('div');
|
|
15
16
|
outer.style.visibility = 'hidden';
|
|
16
17
|
outer.style.width = '100px';
|
|
17
18
|
// @ts-expect-error
|
|
18
19
|
outer.style.msOverflowStyle = 'scrollbar'; // needed for WinJS apps
|
|
19
20
|
document.body.appendChild(outer);
|
|
20
|
-
|
|
21
|
+
var widthNoScroll = outer.offsetWidth;
|
|
21
22
|
outer.style.overflow = 'scroll';
|
|
22
|
-
|
|
23
|
+
var inner = document.createElement('div');
|
|
23
24
|
inner.style.width = '100%';
|
|
24
25
|
outer.appendChild(inner);
|
|
25
|
-
|
|
26
|
-
outer.parentNode
|
|
26
|
+
var widthWithScroll = inner.offsetWidth;
|
|
27
|
+
(_outer$parentNode = outer.parentNode) === null || _outer$parentNode === void 0 || _outer$parentNode.removeChild(outer);
|
|
27
28
|
return widthNoScroll - widthWithScroll;
|
|
28
29
|
}
|
|
29
30
|
function getIntValueFromCss(value) {
|
|
30
31
|
return !Number.isNaN(Number(value)) ? Number(value) : Number.parseInt(value, 10);
|
|
31
32
|
}
|
|
32
|
-
|
|
33
|
-
|
|
33
|
+
var scrollPreventers = new Set();
|
|
34
|
+
var lockedBodyStyles = {
|
|
34
35
|
paddingRight: '',
|
|
35
36
|
overflow: '',
|
|
36
37
|
boxSizing: ''
|
|
37
38
|
};
|
|
38
|
-
function usePreventScroll(
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
_react
|
|
39
|
+
function usePreventScroll() {
|
|
40
|
+
var visible = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
|
|
41
|
+
var disabled = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
|
42
|
+
var scrollbarWidth = _react["default"].useMemo(getScrollbarWidth, [getScrollbarWidth]);
|
|
43
|
+
var id = (0, _uniqueID.useUID)('scroll-preventer-');
|
|
44
|
+
_react["default"].useEffect(function () {
|
|
42
45
|
if (disabled) return;
|
|
43
|
-
if (!(0, _canUseDOM
|
|
46
|
+
if (!(0, _canUseDOM["default"])() || !visible) return;
|
|
44
47
|
scrollPreventers.add(id);
|
|
45
48
|
if (scrollPreventers.size > 1) return;
|
|
46
|
-
|
|
47
|
-
paddingRight
|
|
48
|
-
} = window.getComputedStyle(document.body);
|
|
49
|
+
var _window$getComputedSt = window.getComputedStyle(document.body),
|
|
50
|
+
paddingRight = _window$getComputedSt.paddingRight;
|
|
49
51
|
lockedBodyStyles.paddingRight = document.body.style.paddingRight;
|
|
50
52
|
lockedBodyStyles.overflow = document.body.style.overflow;
|
|
51
53
|
lockedBodyStyles.boxSizing = document.body.style.boxSizing;
|
|
52
|
-
|
|
53
|
-
|
|
54
|
+
var intPaddingRight = getIntValueFromCss(paddingRight);
|
|
55
|
+
var intPaddingRightFromStyle = getIntValueFromCss(document.body.style.paddingRight);
|
|
54
56
|
// Detected own style for window inside window
|
|
55
57
|
if (intPaddingRightFromStyle !== scrollbarWidth) {
|
|
56
58
|
intPaddingRightFromStyle = 0;
|
|
@@ -59,11 +61,11 @@ function usePreventScroll(visible = true, disabled = false) {
|
|
|
59
61
|
document.body.style.paddingRight = scrollbarWidth + (intPaddingRight - intPaddingRightFromStyle) + 'px';
|
|
60
62
|
document.body.style.boxSizing = 'border-box';
|
|
61
63
|
}, [visible, id, disabled]);
|
|
62
|
-
_react
|
|
64
|
+
_react["default"].useEffect(function () {
|
|
63
65
|
if (disabled) return;
|
|
64
|
-
if (!(0, _canUseDOM
|
|
65
|
-
return ()
|
|
66
|
-
scrollPreventers
|
|
66
|
+
if (!(0, _canUseDOM["default"])() || !visible) return;
|
|
67
|
+
return function () {
|
|
68
|
+
scrollPreventers["delete"](id);
|
|
67
69
|
if (scrollPreventers.size !== 0) return;
|
|
68
70
|
document.body.style.overflow = lockedBodyStyles.overflow;
|
|
69
71
|
document.body.style.paddingRight = lockedBodyStyles.paddingRight;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usePreventScroll.js","names":["_react","_interopRequireDefault","require","_canUseDOM","_uniqueID","getScrollbarWidth","canUseDOM","outer","document","createElement","style","visibility","width","msOverflowStyle","body","appendChild","widthNoScroll","offsetWidth","overflow","inner","widthWithScroll","parentNode","removeChild","getIntValueFromCss","value","Number","isNaN","parseInt","scrollPreventers","Set","lockedBodyStyles","paddingRight","boxSizing","usePreventScroll","visible","disabled","scrollbarWidth","React","useMemo","id","useUID","useEffect","add","size","window","getComputedStyle","intPaddingRight","intPaddingRightFromStyle"
|
|
1
|
+
{"version":3,"file":"usePreventScroll.js","names":["_react","_interopRequireDefault","require","_canUseDOM","_uniqueID","getScrollbarWidth","_outer$parentNode","canUseDOM","outer","document","createElement","style","visibility","width","msOverflowStyle","body","appendChild","widthNoScroll","offsetWidth","overflow","inner","widthWithScroll","parentNode","removeChild","getIntValueFromCss","value","Number","isNaN","parseInt","scrollPreventers","Set","lockedBodyStyles","paddingRight","boxSizing","usePreventScroll","visible","arguments","length","undefined","disabled","scrollbarWidth","React","useMemo","id","useUID","useEffect","add","size","_window$getComputedSt","window","getComputedStyle","intPaddingRight","intPaddingRightFromStyle"],"sources":["../../../src/utils/use/usePreventScroll.tsx"],"sourcesContent":["import React from 'react';\n\nimport canUseDOM from '../canUseDOM';\nimport { useUID } from '../uniqueID';\n\nexport function getScrollbarWidth(): number {\n if (!canUseDOM()) return 0;\n const outer = document.createElement('div');\n outer.style.visibility = 'hidden';\n outer.style.width = '100px';\n // @ts-expect-error\n outer.style.msOverflowStyle = 'scrollbar'; // needed for WinJS apps\n document.body.appendChild(outer);\n\n const widthNoScroll = outer.offsetWidth;\n outer.style.overflow = 'scroll';\n\n const inner = document.createElement('div');\n inner.style.width = '100%';\n outer.appendChild(inner);\n\n const widthWithScroll = inner.offsetWidth;\n\n outer.parentNode?.removeChild(outer);\n\n return widthNoScroll - widthWithScroll;\n}\n\nfunction getIntValueFromCss(value: any) {\n return !Number.isNaN(Number(value)) ? Number(value) : Number.parseInt(value, 10);\n}\n\nconst scrollPreventers = new Set<string>();\nconst lockedBodyStyles = {\n paddingRight: '',\n overflow: '',\n boxSizing: '',\n};\nexport default function usePreventScroll(visible = true, disabled = false) {\n const scrollbarWidth = React.useMemo(getScrollbarWidth, [getScrollbarWidth]);\n const id = useUID('scroll-preventer-');\n\n React.useEffect(() => {\n if (disabled) return;\n if (!canUseDOM() || !visible) return;\n scrollPreventers.add(id);\n if (scrollPreventers.size > 1) return;\n\n const { paddingRight } = window.getComputedStyle(document.body);\n\n lockedBodyStyles.paddingRight = document.body.style.paddingRight;\n lockedBodyStyles.overflow = document.body.style.overflow;\n lockedBodyStyles.boxSizing = document.body.style.boxSizing;\n\n const intPaddingRight = getIntValueFromCss(paddingRight);\n let intPaddingRightFromStyle = getIntValueFromCss(document.body.style.paddingRight);\n // Detected own style for window inside window\n if (intPaddingRightFromStyle !== scrollbarWidth) {\n intPaddingRightFromStyle = 0;\n }\n\n document.body.style.overflow = 'hidden';\n document.body.style.paddingRight =\n scrollbarWidth + (intPaddingRight - intPaddingRightFromStyle) + 'px';\n document.body.style.boxSizing = 'border-box';\n }, [visible, id, disabled]);\n\n React.useEffect(() => {\n if (disabled) return;\n if (!canUseDOM() || !visible) return;\n return () => {\n scrollPreventers.delete(id);\n if (scrollPreventers.size !== 0) return;\n document.body.style.overflow = lockedBodyStyles.overflow;\n document.body.style.paddingRight = lockedBodyStyles.paddingRight;\n document.body.style.boxSizing = lockedBodyStyles.boxSizing;\n };\n }, [visible, id, disabled]);\n}\n"],"mappings":";;;;;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AAEA,IAAAC,UAAA,GAAAF,sBAAA,CAAAC,OAAA;AACA,IAAAE,SAAA,GAAAF,OAAA;AAEO,SAASG,iBAAiBA,CAAA,EAAW;EAAA,IAAAC,iBAAA;EAC1C,IAAI,CAAC,IAAAC,qBAAS,EAAC,CAAC,EAAE,OAAO,CAAC;EAC1B,IAAMC,KAAK,GAAGC,QAAQ,CAACC,aAAa,CAAC,KAAK,CAAC;EAC3CF,KAAK,CAACG,KAAK,CAACC,UAAU,GAAG,QAAQ;EACjCJ,KAAK,CAACG,KAAK,CAACE,KAAK,GAAG,OAAO;EAC3B;EACAL,KAAK,CAACG,KAAK,CAACG,eAAe,GAAG,WAAW,CAAC,CAAC;EAC3CL,QAAQ,CAACM,IAAI,CAACC,WAAW,CAACR,KAAK,CAAC;EAEhC,IAAMS,aAAa,GAAGT,KAAK,CAACU,WAAW;EACvCV,KAAK,CAACG,KAAK,CAACQ,QAAQ,GAAG,QAAQ;EAE/B,IAAMC,KAAK,GAAGX,QAAQ,CAACC,aAAa,CAAC,KAAK,CAAC;EAC3CU,KAAK,CAACT,KAAK,CAACE,KAAK,GAAG,MAAM;EAC1BL,KAAK,CAACQ,WAAW,CAACI,KAAK,CAAC;EAExB,IAAMC,eAAe,GAAGD,KAAK,CAACF,WAAW;EAEzC,CAAAZ,iBAAA,GAAAE,KAAK,CAACc,UAAU,cAAAhB,iBAAA,eAAhBA,iBAAA,CAAkBiB,WAAW,CAACf,KAAK,CAAC;EAEpC,OAAOS,aAAa,GAAGI,eAAe;AACxC;AAEA,SAASG,kBAAkBA,CAACC,KAAU,EAAE;EACtC,OAAO,CAACC,MAAM,CAACC,KAAK,CAACD,MAAM,CAACD,KAAK,CAAC,CAAC,GAAGC,MAAM,CAACD,KAAK,CAAC,GAAGC,MAAM,CAACE,QAAQ,CAACH,KAAK,EAAE,EAAE,CAAC;AAClF;AAEA,IAAMI,gBAAgB,GAAG,IAAIC,GAAG,CAAS,CAAC;AAC1C,IAAMC,gBAAgB,GAAG;EACvBC,YAAY,EAAE,EAAE;EAChBb,QAAQ,EAAE,EAAE;EACZc,SAAS,EAAE;AACb,CAAC;AACc,SAASC,gBAAgBA,CAAA,EAAmC;EAAA,IAAlCC,OAAO,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,IAAI;EAAA,IAAEG,QAAQ,GAAAH,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,KAAK;EACvE,IAAMI,cAAc,GAAGC,iBAAK,CAACC,OAAO,CAACrC,iBAAiB,EAAE,CAACA,iBAAiB,CAAC,CAAC;EAC5E,IAAMsC,EAAE,GAAG,IAAAC,gBAAM,EAAC,mBAAmB,CAAC;EAEtCH,iBAAK,CAACI,SAAS,CAAC,YAAM;IACpB,IAAIN,QAAQ,EAAE;IACd,IAAI,CAAC,IAAAhC,qBAAS,EAAC,CAAC,IAAI,CAAC4B,OAAO,EAAE;IAC9BN,gBAAgB,CAACiB,GAAG,CAACH,EAAE,CAAC;IACxB,IAAId,gBAAgB,CAACkB,IAAI,GAAG,CAAC,EAAE;IAE/B,IAAAC,qBAAA,GAAyBC,MAAM,CAACC,gBAAgB,CAACzC,QAAQ,CAACM,IAAI,CAAC;MAAvDiB,YAAY,GAAAgB,qBAAA,CAAZhB,YAAY;IAEpBD,gBAAgB,CAACC,YAAY,GAAGvB,QAAQ,CAACM,IAAI,CAACJ,KAAK,CAACqB,YAAY;IAChED,gBAAgB,CAACZ,QAAQ,GAAGV,QAAQ,CAACM,IAAI,CAACJ,KAAK,CAACQ,QAAQ;IACxDY,gBAAgB,CAACE,SAAS,GAAGxB,QAAQ,CAACM,IAAI,CAACJ,KAAK,CAACsB,SAAS;IAE1D,IAAMkB,eAAe,GAAG3B,kBAAkB,CAACQ,YAAY,CAAC;IACxD,IAAIoB,wBAAwB,GAAG5B,kBAAkB,CAACf,QAAQ,CAACM,IAAI,CAACJ,KAAK,CAACqB,YAAY,CAAC;IACnF;IACA,IAAIoB,wBAAwB,KAAKZ,cAAc,EAAE;MAC/CY,wBAAwB,GAAG,CAAC;IAC9B;IAEA3C,QAAQ,CAACM,IAAI,CAACJ,KAAK,CAACQ,QAAQ,GAAG,QAAQ;IACvCV,QAAQ,CAACM,IAAI,CAACJ,KAAK,CAACqB,YAAY,GAC9BQ,cAAc,IAAIW,eAAe,GAAGC,wBAAwB,CAAC,GAAG,IAAI;IACtE3C,QAAQ,CAACM,IAAI,CAACJ,KAAK,CAACsB,SAAS,GAAG,YAAY;EAC9C,CAAC,EAAE,CAACE,OAAO,EAAEQ,EAAE,EAAEJ,QAAQ,CAAC,CAAC;EAE3BE,iBAAK,CAACI,SAAS,CAAC,YAAM;IACpB,IAAIN,QAAQ,EAAE;IACd,IAAI,CAAC,IAAAhC,qBAAS,EAAC,CAAC,IAAI,CAAC4B,OAAO,EAAE;IAC9B,OAAO,YAAM;MACXN,gBAAgB,UAAO,CAACc,EAAE,CAAC;MAC3B,IAAId,gBAAgB,CAACkB,IAAI,KAAK,CAAC,EAAE;MACjCtC,QAAQ,CAACM,IAAI,CAACJ,KAAK,CAACQ,QAAQ,GAAGY,gBAAgB,CAACZ,QAAQ;MACxDV,QAAQ,CAACM,IAAI,CAACJ,KAAK,CAACqB,YAAY,GAAGD,gBAAgB,CAACC,YAAY;MAChEvB,QAAQ,CAACM,IAAI,CAACJ,KAAK,CAACsB,SAAS,GAAGF,gBAAgB,CAACE,SAAS;IAC5D,CAAC;EACH,CAAC,EAAE,CAACE,OAAO,EAAEQ,EAAE,EAAEJ,QAAQ,CAAC,CAAC;AAC7B","ignoreList":[]}
|
|
@@ -2,47 +2,49 @@ import React from 'react';
|
|
|
2
2
|
import canUseDOM from "../canUseDOM.mjs";
|
|
3
3
|
import { useUID } from "../uniqueID.mjs";
|
|
4
4
|
export function getScrollbarWidth() {
|
|
5
|
+
var _outer$parentNode;
|
|
5
6
|
if (!canUseDOM()) return 0;
|
|
6
|
-
|
|
7
|
+
var outer = document.createElement('div');
|
|
7
8
|
outer.style.visibility = 'hidden';
|
|
8
9
|
outer.style.width = '100px';
|
|
9
10
|
// @ts-expect-error
|
|
10
11
|
outer.style.msOverflowStyle = 'scrollbar'; // needed for WinJS apps
|
|
11
12
|
document.body.appendChild(outer);
|
|
12
|
-
|
|
13
|
+
var widthNoScroll = outer.offsetWidth;
|
|
13
14
|
outer.style.overflow = 'scroll';
|
|
14
|
-
|
|
15
|
+
var inner = document.createElement('div');
|
|
15
16
|
inner.style.width = '100%';
|
|
16
17
|
outer.appendChild(inner);
|
|
17
|
-
|
|
18
|
-
outer.parentNode
|
|
18
|
+
var widthWithScroll = inner.offsetWidth;
|
|
19
|
+
(_outer$parentNode = outer.parentNode) === null || _outer$parentNode === void 0 || _outer$parentNode.removeChild(outer);
|
|
19
20
|
return widthNoScroll - widthWithScroll;
|
|
20
21
|
}
|
|
21
22
|
function getIntValueFromCss(value) {
|
|
22
23
|
return !Number.isNaN(Number(value)) ? Number(value) : Number.parseInt(value, 10);
|
|
23
24
|
}
|
|
24
|
-
|
|
25
|
-
|
|
25
|
+
var scrollPreventers = new Set();
|
|
26
|
+
var lockedBodyStyles = {
|
|
26
27
|
paddingRight: '',
|
|
27
28
|
overflow: '',
|
|
28
29
|
boxSizing: ''
|
|
29
30
|
};
|
|
30
|
-
export default function usePreventScroll(
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
React.
|
|
31
|
+
export default function usePreventScroll() {
|
|
32
|
+
var visible = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
|
|
33
|
+
var disabled = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
|
34
|
+
var scrollbarWidth = React.useMemo(getScrollbarWidth, [getScrollbarWidth]);
|
|
35
|
+
var id = useUID('scroll-preventer-');
|
|
36
|
+
React.useEffect(function () {
|
|
34
37
|
if (disabled) return;
|
|
35
38
|
if (!canUseDOM() || !visible) return;
|
|
36
39
|
scrollPreventers.add(id);
|
|
37
40
|
if (scrollPreventers.size > 1) return;
|
|
38
|
-
|
|
39
|
-
paddingRight
|
|
40
|
-
} = window.getComputedStyle(document.body);
|
|
41
|
+
var _window$getComputedSt = window.getComputedStyle(document.body),
|
|
42
|
+
paddingRight = _window$getComputedSt.paddingRight;
|
|
41
43
|
lockedBodyStyles.paddingRight = document.body.style.paddingRight;
|
|
42
44
|
lockedBodyStyles.overflow = document.body.style.overflow;
|
|
43
45
|
lockedBodyStyles.boxSizing = document.body.style.boxSizing;
|
|
44
|
-
|
|
45
|
-
|
|
46
|
+
var intPaddingRight = getIntValueFromCss(paddingRight);
|
|
47
|
+
var intPaddingRightFromStyle = getIntValueFromCss(document.body.style.paddingRight);
|
|
46
48
|
// Detected own style for window inside window
|
|
47
49
|
if (intPaddingRightFromStyle !== scrollbarWidth) {
|
|
48
50
|
intPaddingRightFromStyle = 0;
|
|
@@ -51,11 +53,11 @@ export default function usePreventScroll(visible = true, disabled = false) {
|
|
|
51
53
|
document.body.style.paddingRight = scrollbarWidth + (intPaddingRight - intPaddingRightFromStyle) + 'px';
|
|
52
54
|
document.body.style.boxSizing = 'border-box';
|
|
53
55
|
}, [visible, id, disabled]);
|
|
54
|
-
React.useEffect(()
|
|
56
|
+
React.useEffect(function () {
|
|
55
57
|
if (disabled) return;
|
|
56
58
|
if (!canUseDOM() || !visible) return;
|
|
57
|
-
return ()
|
|
58
|
-
scrollPreventers
|
|
59
|
+
return function () {
|
|
60
|
+
scrollPreventers["delete"](id);
|
|
59
61
|
if (scrollPreventers.size !== 0) return;
|
|
60
62
|
document.body.style.overflow = lockedBodyStyles.overflow;
|
|
61
63
|
document.body.style.paddingRight = lockedBodyStyles.paddingRight;
|