react-simplikit 0.0.53 → 0.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 +126 -0
- package/README.md +2 -42
- package/dist/hooks/useAsyncEffect/useAsyncEffect.cjs +1 -0
- package/dist/hooks/useAsyncEffect/useAsyncEffect.mjs +1 -0
- package/dist/hooks/useCallbackOncePerRender/useCallbackOncePerRender.cjs +1 -0
- package/dist/hooks/useCallbackOncePerRender/useCallbackOncePerRender.mjs +1 -0
- package/dist/hooks/useConditionalEffect/useConditionalEffect.cjs +1 -0
- package/dist/hooks/useConditionalEffect/useConditionalEffect.mjs +1 -0
- package/dist/hooks/useDebouncedCallback/useDebouncedCallback.cjs +24 -6
- package/dist/hooks/useDebouncedCallback/useDebouncedCallback.d.cts +17 -7
- package/dist/hooks/useDebouncedCallback/useDebouncedCallback.d.mts +17 -7
- package/dist/hooks/useDebouncedCallback/useDebouncedCallback.mjs +24 -6
- package/dist/hooks/useDoubleClick/useDoubleClick.cjs +0 -4
- package/dist/hooks/useDoubleClick/useDoubleClick.d.cts +0 -4
- package/dist/hooks/useDoubleClick/useDoubleClick.d.mts +0 -4
- package/dist/hooks/useDoubleClick/useDoubleClick.mjs +0 -4
- package/dist/hooks/useGeolocation/useGeolocation.cjs +0 -4
- package/dist/hooks/useGeolocation/useGeolocation.d.cts +0 -4
- package/dist/hooks/useGeolocation/useGeolocation.d.mts +0 -4
- package/dist/hooks/useGeolocation/useGeolocation.mjs +0 -4
- package/dist/hooks/useImpressionRef/useImpressionRef.cjs +7 -5
- package/dist/hooks/useImpressionRef/useImpressionRef.d.cts +0 -4
- package/dist/hooks/useImpressionRef/useImpressionRef.d.mts +0 -4
- package/dist/hooks/useImpressionRef/useImpressionRef.mjs +7 -5
- package/dist/hooks/useInputState/useInputState.cjs +9 -3
- package/dist/hooks/useInputState/useInputState.d.cts +11 -4
- package/dist/hooks/useInputState/useInputState.d.mts +11 -4
- package/dist/hooks/useInputState/useInputState.mjs +9 -3
- package/dist/hooks/useIntersectionObserver/useIntersectionObserver.cjs +1 -5
- package/dist/hooks/useIntersectionObserver/useIntersectionObserver.d.cts +1 -5
- package/dist/hooks/useIntersectionObserver/useIntersectionObserver.d.mts +1 -5
- package/dist/hooks/useIntersectionObserver/useIntersectionObserver.mjs +1 -5
- package/dist/hooks/useList/useList.cjs +11 -8
- package/dist/hooks/useList/useList.d.cts +12 -9
- package/dist/hooks/useList/useList.d.mts +12 -9
- package/dist/hooks/useList/useList.mjs +11 -8
- package/dist/hooks/useLoading/useLoading.cjs +3 -5
- package/dist/hooks/useLoading/useLoading.d.cts +2 -5
- package/dist/hooks/useLoading/useLoading.d.mts +2 -5
- package/dist/hooks/useLoading/useLoading.mjs +3 -5
- package/dist/hooks/useLongPress/useLongPress.cjs +0 -4
- package/dist/hooks/useLongPress/useLongPress.d.cts +0 -4
- package/dist/hooks/useLongPress/useLongPress.d.mts +0 -4
- package/dist/hooks/useLongPress/useLongPress.mjs +0 -4
- package/dist/hooks/useOutsideClickEffect/useOutsideClickEffect.cjs +0 -4
- package/dist/hooks/useOutsideClickEffect/useOutsideClickEffect.d.cts +0 -4
- package/dist/hooks/useOutsideClickEffect/useOutsideClickEffect.d.mts +0 -4
- package/dist/hooks/useOutsideClickEffect/useOutsideClickEffect.mjs +0 -4
- package/dist/hooks/usePreservedReference/usePreservedReference.cjs +1 -0
- package/dist/hooks/usePreservedReference/usePreservedReference.mjs +1 -0
- package/dist/hooks/useRefEffect/useRefEffect.cjs +1 -0
- package/dist/hooks/useRefEffect/useRefEffect.mjs +1 -0
- package/dist/hooks/useSet/useSet.cjs +11 -2
- package/dist/hooks/useSet/useSet.d.cts +11 -2
- package/dist/hooks/useSet/useSet.d.mts +11 -2
- package/dist/hooks/useSet/useSet.mjs +11 -2
- package/dist/hooks/useStorageState/useStorageState.cjs +1 -0
- package/dist/hooks/useStorageState/useStorageState.d.cts +0 -4
- package/dist/hooks/useStorageState/useStorageState.d.mts +0 -4
- package/dist/hooks/useStorageState/useStorageState.mjs +1 -0
- package/dist/hooks/useThrottledCallback/useThrottledCallback.cjs +16 -9
- package/dist/hooks/useThrottledCallback/useThrottledCallback.d.cts +18 -11
- package/dist/hooks/useThrottledCallback/useThrottledCallback.d.mts +18 -11
- package/dist/hooks/useThrottledCallback/useThrottledCallback.mjs +16 -9
- package/dist/hooks/useVisibilityEvent/useVisibilityEvent.cjs +2 -4
- package/dist/hooks/useVisibilityEvent/useVisibilityEvent.d.cts +2 -4
- package/dist/hooks/useVisibilityEvent/useVisibilityEvent.d.mts +2 -4
- package/dist/hooks/useVisibilityEvent/useVisibilityEvent.mjs +2 -4
- package/dist/index.cjs +34 -0
- package/dist/index.d.cts +19 -1
- package/dist/index.d.mts +19 -1
- package/dist/index.mjs +18 -1
- package/dist/mobile/hooks/useAvoidKeyboard/index.d.cts +3 -0
- package/dist/mobile/hooks/useAvoidKeyboard/index.d.mts +3 -0
- package/dist/mobile/hooks/useAvoidKeyboard/useAvoidKeyboard.cjs +75 -0
- package/dist/mobile/hooks/useAvoidKeyboard/useAvoidKeyboard.d.cts +89 -0
- package/dist/mobile/hooks/useAvoidKeyboard/useAvoidKeyboard.d.mts +89 -0
- package/dist/mobile/hooks/useAvoidKeyboard/useAvoidKeyboard.mjs +75 -0
- package/dist/mobile/hooks/useBodyScrollLock/useBodyScrollLock.cjs +47 -0
- package/dist/mobile/hooks/useBodyScrollLock/useBodyScrollLock.d.cts +37 -0
- package/dist/mobile/hooks/useBodyScrollLock/useBodyScrollLock.d.mts +37 -0
- package/dist/mobile/hooks/useBodyScrollLock/useBodyScrollLock.mjs +47 -0
- package/dist/mobile/hooks/useKeyboardHeight/useKeyboardHeight.cjs +41 -0
- package/dist/mobile/hooks/useKeyboardHeight/useKeyboardHeight.d.cts +41 -0
- package/dist/mobile/hooks/useKeyboardHeight/useKeyboardHeight.d.mts +41 -0
- package/dist/mobile/hooks/useKeyboardHeight/useKeyboardHeight.mjs +41 -0
- package/dist/mobile/hooks/useNetworkStatus/useNetworkStatus.cjs +88 -0
- package/dist/mobile/hooks/useNetworkStatus/useNetworkStatus.d.cts +77 -0
- package/dist/mobile/hooks/useNetworkStatus/useNetworkStatus.d.mts +77 -0
- package/dist/mobile/hooks/useNetworkStatus/useNetworkStatus.mjs +88 -0
- package/dist/mobile/hooks/usePageVisibility/usePageVisibility.cjs +75 -0
- package/dist/mobile/hooks/usePageVisibility/usePageVisibility.d.cts +64 -0
- package/dist/mobile/hooks/usePageVisibility/usePageVisibility.d.mts +64 -0
- package/dist/mobile/hooks/usePageVisibility/usePageVisibility.mjs +75 -0
- package/dist/mobile/hooks/useSafeAreaInset/useSafeAreaInset.cjs +74 -0
- package/dist/mobile/hooks/useSafeAreaInset/useSafeAreaInset.d.cts +55 -0
- package/dist/mobile/hooks/useSafeAreaInset/useSafeAreaInset.d.mts +55 -0
- package/dist/mobile/hooks/useSafeAreaInset/useSafeAreaInset.mjs +74 -0
- package/dist/mobile/hooks/useScrollDirection/useScrollDirection.cjs +79 -0
- package/dist/mobile/hooks/useScrollDirection/useScrollDirection.d.cts +40 -0
- package/dist/mobile/hooks/useScrollDirection/useScrollDirection.d.mts +40 -0
- package/dist/mobile/hooks/useScrollDirection/useScrollDirection.mjs +79 -0
- package/dist/mobile/hooks/useVisualViewport/useVisualViewport.cjs +77 -0
- package/dist/mobile/hooks/useVisualViewport/useVisualViewport.d.cts +89 -0
- package/dist/mobile/hooks/useVisualViewport/useVisualViewport.d.mts +89 -0
- package/dist/mobile/hooks/useVisualViewport/useVisualViewport.mjs +77 -0
- package/dist/mobile/utils/disableBodyScrollLock/disableBodyScrollLock.cjs +55 -0
- package/dist/mobile/utils/disableBodyScrollLock/disableBodyScrollLock.d.cts +22 -0
- package/dist/mobile/utils/disableBodyScrollLock/disableBodyScrollLock.d.mts +22 -0
- package/dist/mobile/utils/disableBodyScrollLock/disableBodyScrollLock.mjs +55 -0
- package/dist/mobile/utils/enableBodyScrollLock/enableBodyScrollLock.cjs +49 -0
- package/dist/mobile/utils/enableBodyScrollLock/enableBodyScrollLock.d.cts +23 -0
- package/dist/mobile/utils/enableBodyScrollLock/enableBodyScrollLock.d.mts +23 -0
- package/dist/mobile/utils/enableBodyScrollLock/enableBodyScrollLock.mjs +49 -0
- package/dist/mobile/utils/getKeyboardHeight/getKeyboardHeight.cjs +35 -0
- package/dist/mobile/utils/getKeyboardHeight/getKeyboardHeight.d.cts +28 -0
- package/dist/mobile/utils/getKeyboardHeight/getKeyboardHeight.d.mts +28 -0
- package/dist/mobile/utils/getKeyboardHeight/getKeyboardHeight.mjs +35 -0
- package/dist/mobile/utils/getSafeAreaInset/getSafeAreaInset.cjs +58 -0
- package/dist/mobile/utils/getSafeAreaInset/getSafeAreaInset.d.cts +44 -0
- package/dist/mobile/utils/getSafeAreaInset/getSafeAreaInset.d.mts +44 -0
- package/dist/mobile/utils/getSafeAreaInset/getSafeAreaInset.mjs +58 -0
- package/dist/mobile/utils/isAndroid/isAndroid.cjs +32 -0
- package/dist/mobile/utils/isAndroid/isAndroid.d.cts +27 -0
- package/dist/mobile/utils/isAndroid/isAndroid.d.mts +27 -0
- package/dist/mobile/utils/isAndroid/isAndroid.mjs +32 -0
- package/dist/mobile/utils/isIOS/isIOS.cjs +37 -0
- package/dist/mobile/utils/isIOS/isIOS.d.cts +30 -0
- package/dist/mobile/utils/isIOS/isIOS.d.mts +30 -0
- package/dist/mobile/utils/isIOS/isIOS.mjs +37 -0
- package/dist/mobile/utils/isKeyboardVisible/isKeyboardVisible.cjs +28 -0
- package/dist/mobile/utils/isKeyboardVisible/isKeyboardVisible.d.cts +25 -0
- package/dist/mobile/utils/isKeyboardVisible/isKeyboardVisible.d.mts +25 -0
- package/dist/mobile/utils/isKeyboardVisible/isKeyboardVisible.mjs +28 -0
- package/dist/mobile/utils/isServer/isServer.cjs +24 -0
- package/dist/mobile/utils/isServer/isServer.d.cts +22 -0
- package/dist/mobile/utils/isServer/isServer.d.mts +22 -0
- package/dist/mobile/utils/isServer/isServer.mjs +24 -0
- package/dist/mobile/utils/subscribeKeyboardHeight/subscribeKeyboardHeight.cjs +71 -0
- package/dist/mobile/utils/subscribeKeyboardHeight/subscribeKeyboardHeight.d.cts +64 -0
- package/dist/mobile/utils/subscribeKeyboardHeight/subscribeKeyboardHeight.d.mts +64 -0
- package/dist/mobile/utils/subscribeKeyboardHeight/subscribeKeyboardHeight.mjs +71 -0
- package/dist/utils/buildContext/buildContext.cjs +1 -0
- package/dist/utils/buildContext/buildContext.mjs +1 -0
- package/dist/utils/mergeProps/mergeProps.cjs +1 -1
- package/dist/utils/mergeProps/mergeProps.d.cts +1 -1
- package/dist/utils/mergeProps/mergeProps.d.mts +1 -1
- package/dist/utils/mergeProps/mergeProps.mjs +1 -1
- package/dist/utils/mergeRefs/mergeRefs.cjs +1 -1
- package/dist/utils/mergeRefs/mergeRefs.d.cts +1 -1
- package/dist/utils/mergeRefs/mergeRefs.d.mts +1 -1
- package/dist/utils/mergeRefs/mergeRefs.mjs +1 -1
- package/package.json +22 -10
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { isServer } from "../isServer/isServer.mjs";
|
|
3
|
+
//#region src/mobile/utils/getSafeAreaInset/getSafeAreaInset.ts
|
|
4
|
+
/**
|
|
5
|
+
* @description
|
|
6
|
+
* `getSafeAreaInset` is a utility function that returns all safe area insets in pixels as an object.
|
|
7
|
+
*
|
|
8
|
+
* This function reads the CSS `env(safe-area-inset-*)` values by creating
|
|
9
|
+
* a temporary DOM element and reading its computed style.
|
|
10
|
+
*
|
|
11
|
+
* Safe area insets account for device-specific UI elements:
|
|
12
|
+
* - **top**: Notch, Dynamic Island, or status bar
|
|
13
|
+
* - **bottom**: Home indicator on Face ID devices
|
|
14
|
+
* - **left/right**: Rounded corners in landscape mode
|
|
15
|
+
*
|
|
16
|
+
* Typical values (iPhone with Face ID, portrait mode):
|
|
17
|
+
* - top: 47-59px (notch/Dynamic Island)
|
|
18
|
+
* - bottom: 34px (home indicator)
|
|
19
|
+
* - left/right: 0px
|
|
20
|
+
*
|
|
21
|
+
* @returns {SafeAreaInset} Object containing safe area insets for all four sides, or all 0 if not available.
|
|
22
|
+
* - top `number` - Top safe area inset in pixels;
|
|
23
|
+
* - bottom `number` - Bottom safe area inset in pixels;
|
|
24
|
+
* - left `number` - Left safe area inset in pixels;
|
|
25
|
+
* - right `number` - Right safe area inset in pixels;
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* const { top, bottom, left, right } = getSafeAreaInset();
|
|
29
|
+
*
|
|
30
|
+
* header.style.paddingTop = `${top}px`;
|
|
31
|
+
* footer.style.paddingBottom = `${bottom}px`;
|
|
32
|
+
*/
|
|
33
|
+
function getSafeAreaInset() {
|
|
34
|
+
if (isServer()) return {
|
|
35
|
+
top: 0,
|
|
36
|
+
bottom: 0,
|
|
37
|
+
left: 0,
|
|
38
|
+
right: 0
|
|
39
|
+
};
|
|
40
|
+
const div = document.createElement("div");
|
|
41
|
+
div.style.position = "fixed";
|
|
42
|
+
div.style.setProperty("padding-top", "env(safe-area-inset-top)");
|
|
43
|
+
div.style.setProperty("padding-bottom", "env(safe-area-inset-bottom)");
|
|
44
|
+
div.style.setProperty("padding-left", "env(safe-area-inset-left)");
|
|
45
|
+
div.style.setProperty("padding-right", "env(safe-area-inset-right)");
|
|
46
|
+
document.body.appendChild(div);
|
|
47
|
+
const computedStyle = window.getComputedStyle(div);
|
|
48
|
+
const inset = {
|
|
49
|
+
top: parseFloat(computedStyle.getPropertyValue("padding-top")) || 0,
|
|
50
|
+
bottom: parseFloat(computedStyle.getPropertyValue("padding-bottom")) || 0,
|
|
51
|
+
left: parseFloat(computedStyle.getPropertyValue("padding-left")) || 0,
|
|
52
|
+
right: parseFloat(computedStyle.getPropertyValue("padding-right")) || 0
|
|
53
|
+
};
|
|
54
|
+
document.body.removeChild(div);
|
|
55
|
+
return inset;
|
|
56
|
+
}
|
|
57
|
+
//#endregion
|
|
58
|
+
export { getSafeAreaInset };
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
const require_isServer = require("../isServer/isServer.cjs");
|
|
3
|
+
//#region src/mobile/utils/isAndroid/isAndroid.ts
|
|
4
|
+
/**
|
|
5
|
+
* @description
|
|
6
|
+
* `isAndroid` is a utility function that detects whether the current device is running Android.
|
|
7
|
+
*
|
|
8
|
+
* Notes:
|
|
9
|
+
* - All Android browsers include the token "Android" in the user agent.
|
|
10
|
+
*
|
|
11
|
+
* @param {string} [userAgent] - Optional user agent string to check. Defaults to `navigator.userAgent`.
|
|
12
|
+
*
|
|
13
|
+
* @returns {boolean} `true` if the device is running Android, `false` otherwise.
|
|
14
|
+
* Returns `false` on server-side rendering environments.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* if (isAndroid()) {
|
|
18
|
+
* // Android-specific code
|
|
19
|
+
* enableAndroidOptimizations();
|
|
20
|
+
* }
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* // With custom user agent
|
|
24
|
+
* const isAndroidDevice = isAndroid('Mozilla/5.0 (Linux; Android 12; Pixel 6) Chrome/120');
|
|
25
|
+
*/
|
|
26
|
+
function isAndroid(userAgent) {
|
|
27
|
+
if (require_isServer.isServer()) return false;
|
|
28
|
+
const ua = userAgent ?? navigator.userAgent;
|
|
29
|
+
return /Android/i.test(ua);
|
|
30
|
+
}
|
|
31
|
+
//#endregion
|
|
32
|
+
exports.isAndroid = isAndroid;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
|
|
2
|
+
//#region src/mobile/utils/isAndroid/isAndroid.d.ts
|
|
3
|
+
/**
|
|
4
|
+
* @description
|
|
5
|
+
* `isAndroid` is a utility function that detects whether the current device is running Android.
|
|
6
|
+
*
|
|
7
|
+
* Notes:
|
|
8
|
+
* - All Android browsers include the token "Android" in the user agent.
|
|
9
|
+
*
|
|
10
|
+
* @param {string} [userAgent] - Optional user agent string to check. Defaults to `navigator.userAgent`.
|
|
11
|
+
*
|
|
12
|
+
* @returns {boolean} `true` if the device is running Android, `false` otherwise.
|
|
13
|
+
* Returns `false` on server-side rendering environments.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* if (isAndroid()) {
|
|
17
|
+
* // Android-specific code
|
|
18
|
+
* enableAndroidOptimizations();
|
|
19
|
+
* }
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* // With custom user agent
|
|
23
|
+
* const isAndroidDevice = isAndroid('Mozilla/5.0 (Linux; Android 12; Pixel 6) Chrome/120');
|
|
24
|
+
*/
|
|
25
|
+
declare function isAndroid(userAgent?: string): boolean;
|
|
26
|
+
//#endregion
|
|
27
|
+
export { isAndroid };
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
|
|
2
|
+
//#region src/mobile/utils/isAndroid/isAndroid.d.ts
|
|
3
|
+
/**
|
|
4
|
+
* @description
|
|
5
|
+
* `isAndroid` is a utility function that detects whether the current device is running Android.
|
|
6
|
+
*
|
|
7
|
+
* Notes:
|
|
8
|
+
* - All Android browsers include the token "Android" in the user agent.
|
|
9
|
+
*
|
|
10
|
+
* @param {string} [userAgent] - Optional user agent string to check. Defaults to `navigator.userAgent`.
|
|
11
|
+
*
|
|
12
|
+
* @returns {boolean} `true` if the device is running Android, `false` otherwise.
|
|
13
|
+
* Returns `false` on server-side rendering environments.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* if (isAndroid()) {
|
|
17
|
+
* // Android-specific code
|
|
18
|
+
* enableAndroidOptimizations();
|
|
19
|
+
* }
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* // With custom user agent
|
|
23
|
+
* const isAndroidDevice = isAndroid('Mozilla/5.0 (Linux; Android 12; Pixel 6) Chrome/120');
|
|
24
|
+
*/
|
|
25
|
+
declare function isAndroid(userAgent?: string): boolean;
|
|
26
|
+
//#endregion
|
|
27
|
+
export { isAndroid };
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { isServer } from "../isServer/isServer.mjs";
|
|
3
|
+
//#region src/mobile/utils/isAndroid/isAndroid.ts
|
|
4
|
+
/**
|
|
5
|
+
* @description
|
|
6
|
+
* `isAndroid` is a utility function that detects whether the current device is running Android.
|
|
7
|
+
*
|
|
8
|
+
* Notes:
|
|
9
|
+
* - All Android browsers include the token "Android" in the user agent.
|
|
10
|
+
*
|
|
11
|
+
* @param {string} [userAgent] - Optional user agent string to check. Defaults to `navigator.userAgent`.
|
|
12
|
+
*
|
|
13
|
+
* @returns {boolean} `true` if the device is running Android, `false` otherwise.
|
|
14
|
+
* Returns `false` on server-side rendering environments.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* if (isAndroid()) {
|
|
18
|
+
* // Android-specific code
|
|
19
|
+
* enableAndroidOptimizations();
|
|
20
|
+
* }
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* // With custom user agent
|
|
24
|
+
* const isAndroidDevice = isAndroid('Mozilla/5.0 (Linux; Android 12; Pixel 6) Chrome/120');
|
|
25
|
+
*/
|
|
26
|
+
function isAndroid(userAgent) {
|
|
27
|
+
if (isServer()) return false;
|
|
28
|
+
const ua = userAgent ?? navigator.userAgent;
|
|
29
|
+
return /Android/i.test(ua);
|
|
30
|
+
}
|
|
31
|
+
//#endregion
|
|
32
|
+
export { isAndroid };
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
const require_isServer = require("../isServer/isServer.cjs");
|
|
3
|
+
//#region src/mobile/utils/isIOS/isIOS.ts
|
|
4
|
+
/**
|
|
5
|
+
* @description
|
|
6
|
+
* `isIOS` is a utility function that detects whether the current device is running iOS or iPadOS.
|
|
7
|
+
*
|
|
8
|
+
* Notes on platform inconsistencies:
|
|
9
|
+
* - Prior to iPadOS 13, iPads reported their platform as "iPad" (or matched /iPad/ in UA).
|
|
10
|
+
* - Starting from iPadOS 13, Apple changed the platform string to "MacIntel"
|
|
11
|
+
* to make websites treat iPadOS as desktop-class Safari.
|
|
12
|
+
* However, these devices still expose multi-touch capabilities.
|
|
13
|
+
*
|
|
14
|
+
* @param {string} [userAgent] - Optional user agent string to check. Defaults to `navigator.userAgent`.
|
|
15
|
+
*
|
|
16
|
+
* @returns {boolean} `true` if the device is running iOS or iPadOS, `false` otherwise.
|
|
17
|
+
* Returns `false` on server-side rendering environments.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* if (isIOS()) {
|
|
21
|
+
* // iOS-specific code
|
|
22
|
+
* enableIOSOptimizations();
|
|
23
|
+
* }
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* // With custom user agent
|
|
27
|
+
* const isIOSDevice = isIOS('Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X)');
|
|
28
|
+
*/
|
|
29
|
+
function isIOS(userAgent) {
|
|
30
|
+
if (require_isServer.isServer()) return false;
|
|
31
|
+
const ua = userAgent ?? navigator.userAgent;
|
|
32
|
+
const platform = navigator.platform;
|
|
33
|
+
const maxTouchPoints = navigator.maxTouchPoints;
|
|
34
|
+
return /iPhone|iPad|iPod/i.test(ua) || platform === "MacIntel" && typeof maxTouchPoints === "number" && maxTouchPoints > 1;
|
|
35
|
+
}
|
|
36
|
+
//#endregion
|
|
37
|
+
exports.isIOS = isIOS;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
|
|
2
|
+
//#region src/mobile/utils/isIOS/isIOS.d.ts
|
|
3
|
+
/**
|
|
4
|
+
* @description
|
|
5
|
+
* `isIOS` is a utility function that detects whether the current device is running iOS or iPadOS.
|
|
6
|
+
*
|
|
7
|
+
* Notes on platform inconsistencies:
|
|
8
|
+
* - Prior to iPadOS 13, iPads reported their platform as "iPad" (or matched /iPad/ in UA).
|
|
9
|
+
* - Starting from iPadOS 13, Apple changed the platform string to "MacIntel"
|
|
10
|
+
* to make websites treat iPadOS as desktop-class Safari.
|
|
11
|
+
* However, these devices still expose multi-touch capabilities.
|
|
12
|
+
*
|
|
13
|
+
* @param {string} [userAgent] - Optional user agent string to check. Defaults to `navigator.userAgent`.
|
|
14
|
+
*
|
|
15
|
+
* @returns {boolean} `true` if the device is running iOS or iPadOS, `false` otherwise.
|
|
16
|
+
* Returns `false` on server-side rendering environments.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* if (isIOS()) {
|
|
20
|
+
* // iOS-specific code
|
|
21
|
+
* enableIOSOptimizations();
|
|
22
|
+
* }
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* // With custom user agent
|
|
26
|
+
* const isIOSDevice = isIOS('Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X)');
|
|
27
|
+
*/
|
|
28
|
+
declare function isIOS(userAgent?: string): boolean;
|
|
29
|
+
//#endregion
|
|
30
|
+
export { isIOS };
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
|
|
2
|
+
//#region src/mobile/utils/isIOS/isIOS.d.ts
|
|
3
|
+
/**
|
|
4
|
+
* @description
|
|
5
|
+
* `isIOS` is a utility function that detects whether the current device is running iOS or iPadOS.
|
|
6
|
+
*
|
|
7
|
+
* Notes on platform inconsistencies:
|
|
8
|
+
* - Prior to iPadOS 13, iPads reported their platform as "iPad" (or matched /iPad/ in UA).
|
|
9
|
+
* - Starting from iPadOS 13, Apple changed the platform string to "MacIntel"
|
|
10
|
+
* to make websites treat iPadOS as desktop-class Safari.
|
|
11
|
+
* However, these devices still expose multi-touch capabilities.
|
|
12
|
+
*
|
|
13
|
+
* @param {string} [userAgent] - Optional user agent string to check. Defaults to `navigator.userAgent`.
|
|
14
|
+
*
|
|
15
|
+
* @returns {boolean} `true` if the device is running iOS or iPadOS, `false` otherwise.
|
|
16
|
+
* Returns `false` on server-side rendering environments.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* if (isIOS()) {
|
|
20
|
+
* // iOS-specific code
|
|
21
|
+
* enableIOSOptimizations();
|
|
22
|
+
* }
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* // With custom user agent
|
|
26
|
+
* const isIOSDevice = isIOS('Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X)');
|
|
27
|
+
*/
|
|
28
|
+
declare function isIOS(userAgent?: string): boolean;
|
|
29
|
+
//#endregion
|
|
30
|
+
export { isIOS };
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { isServer } from "../isServer/isServer.mjs";
|
|
3
|
+
//#region src/mobile/utils/isIOS/isIOS.ts
|
|
4
|
+
/**
|
|
5
|
+
* @description
|
|
6
|
+
* `isIOS` is a utility function that detects whether the current device is running iOS or iPadOS.
|
|
7
|
+
*
|
|
8
|
+
* Notes on platform inconsistencies:
|
|
9
|
+
* - Prior to iPadOS 13, iPads reported their platform as "iPad" (or matched /iPad/ in UA).
|
|
10
|
+
* - Starting from iPadOS 13, Apple changed the platform string to "MacIntel"
|
|
11
|
+
* to make websites treat iPadOS as desktop-class Safari.
|
|
12
|
+
* However, these devices still expose multi-touch capabilities.
|
|
13
|
+
*
|
|
14
|
+
* @param {string} [userAgent] - Optional user agent string to check. Defaults to `navigator.userAgent`.
|
|
15
|
+
*
|
|
16
|
+
* @returns {boolean} `true` if the device is running iOS or iPadOS, `false` otherwise.
|
|
17
|
+
* Returns `false` on server-side rendering environments.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* if (isIOS()) {
|
|
21
|
+
* // iOS-specific code
|
|
22
|
+
* enableIOSOptimizations();
|
|
23
|
+
* }
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* // With custom user agent
|
|
27
|
+
* const isIOSDevice = isIOS('Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X)');
|
|
28
|
+
*/
|
|
29
|
+
function isIOS(userAgent) {
|
|
30
|
+
if (isServer()) return false;
|
|
31
|
+
const ua = userAgent ?? navigator.userAgent;
|
|
32
|
+
const platform = navigator.platform;
|
|
33
|
+
const maxTouchPoints = navigator.maxTouchPoints;
|
|
34
|
+
return /iPhone|iPad|iPod/i.test(ua) || platform === "MacIntel" && typeof maxTouchPoints === "number" && maxTouchPoints > 1;
|
|
35
|
+
}
|
|
36
|
+
//#endregion
|
|
37
|
+
export { isIOS };
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
const require_getKeyboardHeight = require("../getKeyboardHeight/getKeyboardHeight.cjs");
|
|
3
|
+
//#region src/mobile/utils/isKeyboardVisible/isKeyboardVisible.ts
|
|
4
|
+
/**
|
|
5
|
+
* @description
|
|
6
|
+
* `isKeyboardVisible` is a utility function that checks whether the on-screen keyboard is currently visible.
|
|
7
|
+
*
|
|
8
|
+
* This function uses `getKeyboardHeight()` internally and returns `true`
|
|
9
|
+
* if the keyboard height is greater than 0.
|
|
10
|
+
*
|
|
11
|
+
* @returns {boolean} `true` if the keyboard is visible, `false` otherwise.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* if (isKeyboardVisible()) {
|
|
15
|
+
* console.log('Keyboard is open');
|
|
16
|
+
* } else {
|
|
17
|
+
* console.log('Keyboard is closed');
|
|
18
|
+
* }
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* // Conditionally show/hide elements based on keyboard visibility
|
|
22
|
+
* const showFloatingButton = !isKeyboardVisible();
|
|
23
|
+
*/
|
|
24
|
+
function isKeyboardVisible() {
|
|
25
|
+
return require_getKeyboardHeight.getKeyboardHeight() > 0;
|
|
26
|
+
}
|
|
27
|
+
//#endregion
|
|
28
|
+
exports.isKeyboardVisible = isKeyboardVisible;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
|
|
2
|
+
//#region src/mobile/utils/isKeyboardVisible/isKeyboardVisible.d.ts
|
|
3
|
+
/**
|
|
4
|
+
* @description
|
|
5
|
+
* `isKeyboardVisible` is a utility function that checks whether the on-screen keyboard is currently visible.
|
|
6
|
+
*
|
|
7
|
+
* This function uses `getKeyboardHeight()` internally and returns `true`
|
|
8
|
+
* if the keyboard height is greater than 0.
|
|
9
|
+
*
|
|
10
|
+
* @returns {boolean} `true` if the keyboard is visible, `false` otherwise.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* if (isKeyboardVisible()) {
|
|
14
|
+
* console.log('Keyboard is open');
|
|
15
|
+
* } else {
|
|
16
|
+
* console.log('Keyboard is closed');
|
|
17
|
+
* }
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* // Conditionally show/hide elements based on keyboard visibility
|
|
21
|
+
* const showFloatingButton = !isKeyboardVisible();
|
|
22
|
+
*/
|
|
23
|
+
declare function isKeyboardVisible(): boolean;
|
|
24
|
+
//#endregion
|
|
25
|
+
export { isKeyboardVisible };
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
|
|
2
|
+
//#region src/mobile/utils/isKeyboardVisible/isKeyboardVisible.d.ts
|
|
3
|
+
/**
|
|
4
|
+
* @description
|
|
5
|
+
* `isKeyboardVisible` is a utility function that checks whether the on-screen keyboard is currently visible.
|
|
6
|
+
*
|
|
7
|
+
* This function uses `getKeyboardHeight()` internally and returns `true`
|
|
8
|
+
* if the keyboard height is greater than 0.
|
|
9
|
+
*
|
|
10
|
+
* @returns {boolean} `true` if the keyboard is visible, `false` otherwise.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* if (isKeyboardVisible()) {
|
|
14
|
+
* console.log('Keyboard is open');
|
|
15
|
+
* } else {
|
|
16
|
+
* console.log('Keyboard is closed');
|
|
17
|
+
* }
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* // Conditionally show/hide elements based on keyboard visibility
|
|
21
|
+
* const showFloatingButton = !isKeyboardVisible();
|
|
22
|
+
*/
|
|
23
|
+
declare function isKeyboardVisible(): boolean;
|
|
24
|
+
//#endregion
|
|
25
|
+
export { isKeyboardVisible };
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { getKeyboardHeight } from "../getKeyboardHeight/getKeyboardHeight.mjs";
|
|
3
|
+
//#region src/mobile/utils/isKeyboardVisible/isKeyboardVisible.ts
|
|
4
|
+
/**
|
|
5
|
+
* @description
|
|
6
|
+
* `isKeyboardVisible` is a utility function that checks whether the on-screen keyboard is currently visible.
|
|
7
|
+
*
|
|
8
|
+
* This function uses `getKeyboardHeight()` internally and returns `true`
|
|
9
|
+
* if the keyboard height is greater than 0.
|
|
10
|
+
*
|
|
11
|
+
* @returns {boolean} `true` if the keyboard is visible, `false` otherwise.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* if (isKeyboardVisible()) {
|
|
15
|
+
* console.log('Keyboard is open');
|
|
16
|
+
* } else {
|
|
17
|
+
* console.log('Keyboard is closed');
|
|
18
|
+
* }
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* // Conditionally show/hide elements based on keyboard visibility
|
|
22
|
+
* const showFloatingButton = !isKeyboardVisible();
|
|
23
|
+
*/
|
|
24
|
+
function isKeyboardVisible() {
|
|
25
|
+
return getKeyboardHeight() > 0;
|
|
26
|
+
}
|
|
27
|
+
//#endregion
|
|
28
|
+
export { isKeyboardVisible };
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
//#region src/mobile/utils/isServer/isServer.ts
|
|
3
|
+
/**
|
|
4
|
+
* @description
|
|
5
|
+
* `isServer` is a utility function that checks if the code is running on the server.
|
|
6
|
+
* It returns `true` in SSR (Server-Side Rendering) environments where `window` is undefined,
|
|
7
|
+
* and `false` in client-side environments.
|
|
8
|
+
*
|
|
9
|
+
* @returns {boolean} `true` if running in a server environment (SSR), `false` otherwise.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* if (isServer()) {
|
|
13
|
+
* // SSR-safe code
|
|
14
|
+
* return null;
|
|
15
|
+
* }
|
|
16
|
+
*
|
|
17
|
+
* // Client-only code
|
|
18
|
+
* window.addEventListener('resize', handleResize);
|
|
19
|
+
*/
|
|
20
|
+
function isServer() {
|
|
21
|
+
return typeof window === "undefined";
|
|
22
|
+
}
|
|
23
|
+
//#endregion
|
|
24
|
+
exports.isServer = isServer;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
|
|
2
|
+
//#region src/mobile/utils/isServer/isServer.d.ts
|
|
3
|
+
/**
|
|
4
|
+
* @description
|
|
5
|
+
* `isServer` is a utility function that checks if the code is running on the server.
|
|
6
|
+
* It returns `true` in SSR (Server-Side Rendering) environments where `window` is undefined,
|
|
7
|
+
* and `false` in client-side environments.
|
|
8
|
+
*
|
|
9
|
+
* @returns {boolean} `true` if running in a server environment (SSR), `false` otherwise.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* if (isServer()) {
|
|
13
|
+
* // SSR-safe code
|
|
14
|
+
* return null;
|
|
15
|
+
* }
|
|
16
|
+
*
|
|
17
|
+
* // Client-only code
|
|
18
|
+
* window.addEventListener('resize', handleResize);
|
|
19
|
+
*/
|
|
20
|
+
declare function isServer(): boolean;
|
|
21
|
+
//#endregion
|
|
22
|
+
export { isServer };
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
|
|
2
|
+
//#region src/mobile/utils/isServer/isServer.d.ts
|
|
3
|
+
/**
|
|
4
|
+
* @description
|
|
5
|
+
* `isServer` is a utility function that checks if the code is running on the server.
|
|
6
|
+
* It returns `true` in SSR (Server-Side Rendering) environments where `window` is undefined,
|
|
7
|
+
* and `false` in client-side environments.
|
|
8
|
+
*
|
|
9
|
+
* @returns {boolean} `true` if running in a server environment (SSR), `false` otherwise.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* if (isServer()) {
|
|
13
|
+
* // SSR-safe code
|
|
14
|
+
* return null;
|
|
15
|
+
* }
|
|
16
|
+
*
|
|
17
|
+
* // Client-only code
|
|
18
|
+
* window.addEventListener('resize', handleResize);
|
|
19
|
+
*/
|
|
20
|
+
declare function isServer(): boolean;
|
|
21
|
+
//#endregion
|
|
22
|
+
export { isServer };
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
//#region src/mobile/utils/isServer/isServer.ts
|
|
3
|
+
/**
|
|
4
|
+
* @description
|
|
5
|
+
* `isServer` is a utility function that checks if the code is running on the server.
|
|
6
|
+
* It returns `true` in SSR (Server-Side Rendering) environments where `window` is undefined,
|
|
7
|
+
* and `false` in client-side environments.
|
|
8
|
+
*
|
|
9
|
+
* @returns {boolean} `true` if running in a server environment (SSR), `false` otherwise.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* if (isServer()) {
|
|
13
|
+
* // SSR-safe code
|
|
14
|
+
* return null;
|
|
15
|
+
* }
|
|
16
|
+
*
|
|
17
|
+
* // Client-only code
|
|
18
|
+
* window.addEventListener('resize', handleResize);
|
|
19
|
+
*/
|
|
20
|
+
function isServer() {
|
|
21
|
+
return typeof window === "undefined";
|
|
22
|
+
}
|
|
23
|
+
//#endregion
|
|
24
|
+
export { isServer };
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
const require_isServer = require("../isServer/isServer.cjs");
|
|
3
|
+
const require_getKeyboardHeight = require("../getKeyboardHeight/getKeyboardHeight.cjs");
|
|
4
|
+
//#region src/mobile/utils/subscribeKeyboardHeight/subscribeKeyboardHeight.ts
|
|
5
|
+
/**
|
|
6
|
+
* @description
|
|
7
|
+
* `subscribeKeyboardHeight` is a utility function that subscribes to changes in the on-screen keyboard height.
|
|
8
|
+
*
|
|
9
|
+
* The provided callback is invoked whenever the keyboard height may change,
|
|
10
|
+
* including when the keyboard appears, disappears, or changes size.
|
|
11
|
+
*
|
|
12
|
+
* Internally, this function listens to both `resize` and `scroll` events
|
|
13
|
+
* on the Visual Viewport:
|
|
14
|
+
* - `resize`: triggered when the visual viewport height changes
|
|
15
|
+
* - `scroll`: triggered when the visual viewport offset changes
|
|
16
|
+
* (important for iOS where the viewport can shift without resizing)
|
|
17
|
+
*
|
|
18
|
+
* Performance optimizations:
|
|
19
|
+
* - Throttled by default (16ms, ~60fps) to prevent excessive callback invocations
|
|
20
|
+
* - Skips callback when height hasn't changed (deduplication)
|
|
21
|
+
*
|
|
22
|
+
* @param {SubscribeKeyboardHeightOptions} options - Configuration options
|
|
23
|
+
* @param {(height: number) => void} options.callback - A function that will be called with the updated keyboard height in pixels.
|
|
24
|
+
* @param {boolean} [options.immediate=false] - If true, the callback will be invoked immediately with the current keyboard height.
|
|
25
|
+
* @param {number} [options.throttleMs=16] - Throttle interval in milliseconds.
|
|
26
|
+
*
|
|
27
|
+
* @returns {SubscribeKeyboardHeightResult} An object containing the unsubscribe function.
|
|
28
|
+
* - unsubscribe `() => void` - Unsubscribes all listeners and stops receiving keyboard height updates.
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* const { unsubscribe } = subscribeKeyboardHeight({
|
|
32
|
+
* callback: (height) => {
|
|
33
|
+
* footer.style.paddingBottom = `${height}px`;
|
|
34
|
+
* },
|
|
35
|
+
* immediate: true,
|
|
36
|
+
* });
|
|
37
|
+
*
|
|
38
|
+
* // Later, when cleanup is needed
|
|
39
|
+
* unsubscribe();
|
|
40
|
+
*/
|
|
41
|
+
function subscribeKeyboardHeight({ callback, immediate = false, throttleMs = 16 }) {
|
|
42
|
+
if (require_isServer.isServer()) return { unsubscribe: () => {} };
|
|
43
|
+
const visualViewport = window.visualViewport;
|
|
44
|
+
if (!visualViewport) return { unsubscribe: () => {} };
|
|
45
|
+
let lastHeight = null;
|
|
46
|
+
let throttleTimer = null;
|
|
47
|
+
const handler = () => {
|
|
48
|
+
if (throttleTimer != null) return;
|
|
49
|
+
const currentHeight = require_getKeyboardHeight.getKeyboardHeight();
|
|
50
|
+
if (lastHeight === currentHeight) return;
|
|
51
|
+
lastHeight = currentHeight;
|
|
52
|
+
callback(currentHeight);
|
|
53
|
+
throttleTimer = setTimeout(() => {
|
|
54
|
+
throttleTimer = null;
|
|
55
|
+
}, throttleMs);
|
|
56
|
+
};
|
|
57
|
+
if (immediate) {
|
|
58
|
+
const currentHeight = require_getKeyboardHeight.getKeyboardHeight();
|
|
59
|
+
lastHeight = currentHeight;
|
|
60
|
+
callback(currentHeight);
|
|
61
|
+
}
|
|
62
|
+
visualViewport.addEventListener("resize", handler);
|
|
63
|
+
visualViewport.addEventListener("scroll", handler);
|
|
64
|
+
return { unsubscribe: () => {
|
|
65
|
+
visualViewport.removeEventListener("resize", handler);
|
|
66
|
+
visualViewport.removeEventListener("scroll", handler);
|
|
67
|
+
if (throttleTimer != null) clearTimeout(throttleTimer);
|
|
68
|
+
} };
|
|
69
|
+
}
|
|
70
|
+
//#endregion
|
|
71
|
+
exports.subscribeKeyboardHeight = subscribeKeyboardHeight;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
|
|
2
|
+
//#region src/mobile/utils/subscribeKeyboardHeight/subscribeKeyboardHeight.d.ts
|
|
3
|
+
type SubscribeKeyboardHeightOptions = {
|
|
4
|
+
/**
|
|
5
|
+
* A function that will be called with the updated keyboard height in pixels.
|
|
6
|
+
*/
|
|
7
|
+
callback: (height: number) => void;
|
|
8
|
+
/**
|
|
9
|
+
* If true, the callback will be invoked immediately with the current keyboard height.
|
|
10
|
+
* @default false
|
|
11
|
+
*/
|
|
12
|
+
immediate?: boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Throttle interval in milliseconds.
|
|
15
|
+
* Events within this interval will be ignored to improve performance.
|
|
16
|
+
* @default 16 (~60fps)
|
|
17
|
+
*/
|
|
18
|
+
throttleMs?: number;
|
|
19
|
+
};
|
|
20
|
+
type SubscribeKeyboardHeightResult = {
|
|
21
|
+
/**
|
|
22
|
+
* Unsubscribes all listeners and stops receiving keyboard height updates.
|
|
23
|
+
*/
|
|
24
|
+
unsubscribe: () => void;
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* @description
|
|
28
|
+
* `subscribeKeyboardHeight` is a utility function that subscribes to changes in the on-screen keyboard height.
|
|
29
|
+
*
|
|
30
|
+
* The provided callback is invoked whenever the keyboard height may change,
|
|
31
|
+
* including when the keyboard appears, disappears, or changes size.
|
|
32
|
+
*
|
|
33
|
+
* Internally, this function listens to both `resize` and `scroll` events
|
|
34
|
+
* on the Visual Viewport:
|
|
35
|
+
* - `resize`: triggered when the visual viewport height changes
|
|
36
|
+
* - `scroll`: triggered when the visual viewport offset changes
|
|
37
|
+
* (important for iOS where the viewport can shift without resizing)
|
|
38
|
+
*
|
|
39
|
+
* Performance optimizations:
|
|
40
|
+
* - Throttled by default (16ms, ~60fps) to prevent excessive callback invocations
|
|
41
|
+
* - Skips callback when height hasn't changed (deduplication)
|
|
42
|
+
*
|
|
43
|
+
* @param {SubscribeKeyboardHeightOptions} options - Configuration options
|
|
44
|
+
* @param {(height: number) => void} options.callback - A function that will be called with the updated keyboard height in pixels.
|
|
45
|
+
* @param {boolean} [options.immediate=false] - If true, the callback will be invoked immediately with the current keyboard height.
|
|
46
|
+
* @param {number} [options.throttleMs=16] - Throttle interval in milliseconds.
|
|
47
|
+
*
|
|
48
|
+
* @returns {SubscribeKeyboardHeightResult} An object containing the unsubscribe function.
|
|
49
|
+
* - unsubscribe `() => void` - Unsubscribes all listeners and stops receiving keyboard height updates.
|
|
50
|
+
*
|
|
51
|
+
* @example
|
|
52
|
+
* const { unsubscribe } = subscribeKeyboardHeight({
|
|
53
|
+
* callback: (height) => {
|
|
54
|
+
* footer.style.paddingBottom = `${height}px`;
|
|
55
|
+
* },
|
|
56
|
+
* immediate: true,
|
|
57
|
+
* });
|
|
58
|
+
*
|
|
59
|
+
* // Later, when cleanup is needed
|
|
60
|
+
* unsubscribe();
|
|
61
|
+
*/
|
|
62
|
+
declare function subscribeKeyboardHeight({ callback, immediate, throttleMs }: SubscribeKeyboardHeightOptions): SubscribeKeyboardHeightResult;
|
|
63
|
+
//#endregion
|
|
64
|
+
export { subscribeKeyboardHeight };
|