@react-aria/utils 3.23.1 → 3.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (171) hide show
  1. package/dist/chain.main.js +26 -0
  2. package/dist/chain.main.js.map +1 -0
  3. package/dist/chain.mjs +21 -0
  4. package/dist/chain.module.js +21 -0
  5. package/dist/chain.module.js.map +1 -0
  6. package/dist/domHelpers.main.js +19 -0
  7. package/dist/domHelpers.main.js.map +1 -0
  8. package/dist/domHelpers.mjs +13 -0
  9. package/dist/domHelpers.module.js +13 -0
  10. package/dist/domHelpers.module.js.map +1 -0
  11. package/dist/filterDOMProps.main.js +45 -0
  12. package/dist/filterDOMProps.main.js.map +1 -0
  13. package/dist/filterDOMProps.mjs +40 -0
  14. package/dist/filterDOMProps.module.js +40 -0
  15. package/dist/filterDOMProps.module.js.map +1 -0
  16. package/dist/focusWithoutScrolling.main.js +72 -0
  17. package/dist/focusWithoutScrolling.main.js.map +1 -0
  18. package/dist/focusWithoutScrolling.mjs +67 -0
  19. package/dist/focusWithoutScrolling.module.js +67 -0
  20. package/dist/focusWithoutScrolling.module.js.map +1 -0
  21. package/dist/getOffset.main.js +24 -0
  22. package/dist/getOffset.main.js.map +1 -0
  23. package/dist/getOffset.mjs +19 -0
  24. package/dist/getOffset.module.js +19 -0
  25. package/dist/getOffset.module.js.map +1 -0
  26. package/dist/getScrollParent.main.js +28 -0
  27. package/dist/getScrollParent.main.js.map +1 -0
  28. package/dist/getScrollParent.mjs +23 -0
  29. package/dist/getScrollParent.module.js +23 -0
  30. package/dist/getScrollParent.module.js.map +1 -0
  31. package/dist/getScrollParents.main.js +30 -0
  32. package/dist/getScrollParents.main.js.map +1 -0
  33. package/dist/getScrollParents.mjs +25 -0
  34. package/dist/getScrollParents.module.js +25 -0
  35. package/dist/getScrollParents.module.js.map +1 -0
  36. package/dist/import.mjs +32 -1232
  37. package/dist/isScrollable.main.js +25 -0
  38. package/dist/isScrollable.main.js.map +1 -0
  39. package/dist/isScrollable.mjs +20 -0
  40. package/dist/isScrollable.module.js +20 -0
  41. package/dist/isScrollable.module.js.map +1 -0
  42. package/dist/isVirtualEvent.main.js +41 -0
  43. package/dist/isVirtualEvent.main.js.map +1 -0
  44. package/dist/isVirtualEvent.mjs +35 -0
  45. package/dist/isVirtualEvent.module.js +35 -0
  46. package/dist/isVirtualEvent.module.js.map +1 -0
  47. package/dist/main.js +80 -1282
  48. package/dist/main.js.map +1 -1
  49. package/dist/mergeProps.main.js +51 -0
  50. package/dist/mergeProps.main.js.map +1 -0
  51. package/dist/mergeProps.mjs +42 -0
  52. package/dist/mergeProps.module.js +42 -0
  53. package/dist/mergeProps.module.js.map +1 -0
  54. package/dist/mergeRefs.main.js +28 -0
  55. package/dist/mergeRefs.main.js.map +1 -0
  56. package/dist/mergeRefs.mjs +23 -0
  57. package/dist/mergeRefs.module.js +23 -0
  58. package/dist/mergeRefs.module.js.map +1 -0
  59. package/dist/module.js +32 -1232
  60. package/dist/module.js.map +1 -1
  61. package/dist/openLink.main.js +143 -0
  62. package/dist/openLink.main.js.map +1 -0
  63. package/dist/openLink.mjs +129 -0
  64. package/dist/openLink.module.js +129 -0
  65. package/dist/openLink.module.js.map +1 -0
  66. package/dist/platform.main.js +64 -0
  67. package/dist/platform.main.js.map +1 -0
  68. package/dist/platform.mjs +51 -0
  69. package/dist/platform.module.js +51 -0
  70. package/dist/platform.module.js.map +1 -0
  71. package/dist/runAfterTransition.main.js +82 -0
  72. package/dist/runAfterTransition.main.js.map +1 -0
  73. package/dist/runAfterTransition.mjs +77 -0
  74. package/dist/runAfterTransition.module.js +77 -0
  75. package/dist/runAfterTransition.module.js.map +1 -0
  76. package/dist/scrollIntoView.main.js +96 -0
  77. package/dist/scrollIntoView.main.js.map +1 -0
  78. package/dist/scrollIntoView.mjs +90 -0
  79. package/dist/scrollIntoView.module.js +90 -0
  80. package/dist/scrollIntoView.module.js.map +1 -0
  81. package/dist/types.d.ts +17 -6
  82. package/dist/types.d.ts.map +1 -1
  83. package/dist/useDeepMemo.main.js +30 -0
  84. package/dist/useDeepMemo.main.js.map +1 -0
  85. package/dist/useDeepMemo.mjs +25 -0
  86. package/dist/useDeepMemo.module.js +25 -0
  87. package/dist/useDeepMemo.module.js.map +1 -0
  88. package/dist/useDescription.main.js +59 -0
  89. package/dist/useDescription.main.js.map +1 -0
  90. package/dist/useDescription.mjs +54 -0
  91. package/dist/useDescription.module.js +54 -0
  92. package/dist/useDescription.module.js.map +1 -0
  93. package/dist/useDrag1D.main.js +139 -0
  94. package/dist/useDrag1D.main.js.map +1 -0
  95. package/dist/useDrag1D.mjs +134 -0
  96. package/dist/useDrag1D.module.js +134 -0
  97. package/dist/useDrag1D.module.js.map +1 -0
  98. package/dist/useEffectEvent.main.js +37 -0
  99. package/dist/useEffectEvent.main.js.map +1 -0
  100. package/dist/useEffectEvent.mjs +32 -0
  101. package/dist/useEffectEvent.module.js +32 -0
  102. package/dist/useEffectEvent.module.js.map +1 -0
  103. package/dist/useEvent.main.js +42 -0
  104. package/dist/useEvent.main.js.map +1 -0
  105. package/dist/useEvent.mjs +37 -0
  106. package/dist/useEvent.module.js +37 -0
  107. package/dist/useEvent.module.js.map +1 -0
  108. package/dist/useFormReset.main.js +41 -0
  109. package/dist/useFormReset.main.js.map +1 -0
  110. package/dist/useFormReset.mjs +36 -0
  111. package/dist/useFormReset.module.js +36 -0
  112. package/dist/useFormReset.module.js.map +1 -0
  113. package/dist/useGlobalListeners.main.js +63 -0
  114. package/dist/useGlobalListeners.main.js.map +1 -0
  115. package/dist/useGlobalListeners.mjs +58 -0
  116. package/dist/useGlobalListeners.module.js +58 -0
  117. package/dist/useGlobalListeners.module.js.map +1 -0
  118. package/dist/useId.main.js +93 -0
  119. package/dist/useId.main.js.map +1 -0
  120. package/dist/useId.mjs +86 -0
  121. package/dist/useId.module.js +86 -0
  122. package/dist/useId.module.js.map +1 -0
  123. package/dist/useLabels.main.js +44 -0
  124. package/dist/useLabels.main.js.map +1 -0
  125. package/dist/useLabels.mjs +39 -0
  126. package/dist/useLabels.module.js +39 -0
  127. package/dist/useLabels.module.js.map +1 -0
  128. package/dist/useLayoutEffect.main.js +27 -0
  129. package/dist/useLayoutEffect.main.js.map +1 -0
  130. package/dist/useLayoutEffect.mjs +18 -0
  131. package/dist/useLayoutEffect.module.js +18 -0
  132. package/dist/useLayoutEffect.module.js.map +1 -0
  133. package/dist/useObjectRef.main.js +37 -0
  134. package/dist/useObjectRef.main.js.map +1 -0
  135. package/dist/useObjectRef.mjs +32 -0
  136. package/dist/useObjectRef.module.js +32 -0
  137. package/dist/useObjectRef.module.js.map +1 -0
  138. package/dist/useResizeObserver.main.js +40 -0
  139. package/dist/useResizeObserver.main.js.map +1 -0
  140. package/dist/useResizeObserver.mjs +35 -0
  141. package/dist/useResizeObserver.module.js +35 -0
  142. package/dist/useResizeObserver.module.js.map +1 -0
  143. package/dist/useSyncRef.main.js +32 -0
  144. package/dist/useSyncRef.main.js.map +1 -0
  145. package/dist/useSyncRef.mjs +27 -0
  146. package/dist/useSyncRef.module.js +27 -0
  147. package/dist/useSyncRef.module.js.map +1 -0
  148. package/dist/useUpdateEffect.main.js +38 -0
  149. package/dist/useUpdateEffect.main.js.map +1 -0
  150. package/dist/useUpdateEffect.mjs +33 -0
  151. package/dist/useUpdateEffect.module.js +33 -0
  152. package/dist/useUpdateEffect.module.js.map +1 -0
  153. package/dist/useValueEffect.main.js +58 -0
  154. package/dist/useValueEffect.main.js.map +1 -0
  155. package/dist/useValueEffect.mjs +53 -0
  156. package/dist/useValueEffect.module.js +53 -0
  157. package/dist/useValueEffect.module.js.map +1 -0
  158. package/dist/useViewportSize.main.js +56 -0
  159. package/dist/useViewportSize.main.js.map +1 -0
  160. package/dist/useViewportSize.mjs +51 -0
  161. package/dist/useViewportSize.module.js +51 -0
  162. package/dist/useViewportSize.module.js.map +1 -0
  163. package/package.json +5 -5
  164. package/src/filterDOMProps.ts +1 -0
  165. package/src/getScrollParent.ts +2 -10
  166. package/src/getScrollParents.ts +26 -0
  167. package/src/index.ts +4 -2
  168. package/src/isScrollable.ts +22 -0
  169. package/src/mergeRefs.ts +2 -2
  170. package/src/openLink.tsx +25 -9
  171. package/src/scrollIntoView.ts +3 -5
@@ -10,6 +10,8 @@
10
10
  * governing permissions and limitations under the License.
11
11
  */
12
12
 
13
+ import {isScrollable} from './isScrollable';
14
+
13
15
  export function getScrollParent(node: Element, checkForOverflow?: boolean): Element {
14
16
  let scrollableNode: Element | null = node;
15
17
  if (isScrollable(scrollableNode, checkForOverflow)) {
@@ -23,13 +25,3 @@ export function getScrollParent(node: Element, checkForOverflow?: boolean): Elem
23
25
  return scrollableNode || document.scrollingElement || document.documentElement;
24
26
  }
25
27
 
26
- export function isScrollable(node: Element, checkForOverflow?: boolean): boolean {
27
- let style = window.getComputedStyle(node);
28
- let isScrollable = /(auto|scroll)/.test(style.overflow + style.overflowX + style.overflowY);
29
-
30
- if (isScrollable && checkForOverflow) {
31
- isScrollable = node.scrollHeight !== node.clientHeight || node.scrollWidth !== node.clientWidth;
32
- }
33
-
34
- return isScrollable;
35
- }
@@ -0,0 +1,26 @@
1
+ /*
2
+ * Copyright 2024 Adobe. All rights reserved.
3
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
4
+ * you may not use this file except in compliance with the License. You may obtain a copy
5
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
6
+ *
7
+ * Unless required by applicable law or agreed to in writing, software distributed under
8
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
9
+ * OF ANY KIND, either express or implied. See the License for the specific language
10
+ * governing permissions and limitations under the License.
11
+ */
12
+
13
+ import {isScrollable} from './isScrollable';
14
+
15
+ export function getScrollParents(node: Element, checkForOverflow?: boolean): Element[] {
16
+ const scrollParents: Element[] = [];
17
+
18
+ while (node && node !== document.documentElement) {
19
+ if (isScrollable(node, checkForOverflow)) {
20
+ scrollParents.push(node);
21
+ }
22
+ node = node.parentElement as Element;
23
+ }
24
+
25
+ return scrollParents;
26
+ }
package/src/index.ts CHANGED
@@ -17,7 +17,7 @@ export {mergeRefs} from './mergeRefs';
17
17
  export {filterDOMProps} from './filterDOMProps';
18
18
  export {focusWithoutScrolling} from './focusWithoutScrolling';
19
19
  export {getOffset} from './getOffset';
20
- export {openLink, getSyntheticLinkProps, RouterProvider, shouldClientNavigate, useRouter} from './openLink';
20
+ export {openLink, getSyntheticLinkProps, RouterProvider, shouldClientNavigate, useRouter, useLinkProps} from './openLink';
21
21
  export {runAfterTransition} from './runAfterTransition';
22
22
  export {useDrag1D} from './useDrag1D';
23
23
  export {useGlobalListeners} from './useGlobalListeners';
@@ -27,7 +27,9 @@ export {useUpdateEffect} from './useUpdateEffect';
27
27
  export {useLayoutEffect} from './useLayoutEffect';
28
28
  export {useResizeObserver} from './useResizeObserver';
29
29
  export {useSyncRef} from './useSyncRef';
30
- export {getScrollParent, isScrollable} from './getScrollParent';
30
+ export {getScrollParent} from './getScrollParent';
31
+ export {getScrollParents} from './getScrollParents';
32
+ export {isScrollable} from './isScrollable';
31
33
  export {useViewportSize} from './useViewportSize';
32
34
  export {useDescription} from './useDescription';
33
35
  export {isMac, isIPhone, isIPad, isIOS, isAppleDevice, isWebKit, isChrome, isAndroid, isFirefox} from './platform';
@@ -0,0 +1,22 @@
1
+ /*
2
+ * Copyright 2024 Adobe. All rights reserved.
3
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
4
+ * you may not use this file except in compliance with the License. You may obtain a copy
5
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
6
+ *
7
+ * Unless required by applicable law or agreed to in writing, software distributed under
8
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
9
+ * OF ANY KIND, either express or implied. See the License for the specific language
10
+ * governing permissions and limitations under the License.
11
+ */
12
+
13
+ export function isScrollable(node: Element, checkForOverflow?: boolean): boolean {
14
+ let style = window.getComputedStyle(node);
15
+ let isScrollable = /(auto|scroll)/.test(style.overflow + style.overflowX + style.overflowY);
16
+
17
+ if (isScrollable && checkForOverflow) {
18
+ isScrollable = node.scrollHeight !== node.clientHeight || node.scrollWidth !== node.clientWidth;
19
+ }
20
+
21
+ return isScrollable;
22
+ }
package/src/mergeRefs.ts CHANGED
@@ -10,12 +10,12 @@
10
10
  * governing permissions and limitations under the License.
11
11
  */
12
12
 
13
- import {ForwardedRef} from 'react';
13
+ import {ForwardedRef, MutableRefObject} from 'react';
14
14
 
15
15
  /**
16
16
  * Merges multiple refs into one. Works with either callback or object refs.
17
17
  */
18
- export function mergeRefs<T>(...refs: ForwardedRef<T>[]): ForwardedRef<T> {
18
+ export function mergeRefs<T>(...refs: Array<ForwardedRef<T> | MutableRefObject<T>>): ForwardedRef<T> {
19
19
  if (refs.length === 1) {
20
20
  return refs[0];
21
21
  }
package/src/openLink.tsx CHANGED
@@ -11,22 +11,25 @@
11
11
  */
12
12
 
13
13
  import {focusWithoutScrolling, isMac, isWebKit} from './index';
14
+ import {Href, LinkDOMProps, RouterOptions} from '@react-types/shared';
14
15
  import {isFirefox, isIPad} from './platform';
15
- import {LinkDOMProps} from '@react-types/shared';
16
16
  import React, {createContext, ReactNode, useContext, useMemo} from 'react';
17
17
 
18
18
  interface Router {
19
19
  isNative: boolean,
20
- open: (target: Element, modifiers: Modifiers) => void
20
+ open: (target: Element, modifiers: Modifiers, href: Href, routerOptions: RouterOptions | undefined) => void,
21
+ useHref: (href: Href) => string
21
22
  }
22
23
 
23
24
  const RouterContext = createContext<Router>({
24
25
  isNative: true,
25
- open: openSyntheticLink
26
+ open: openSyntheticLink,
27
+ useHref: (href) => href
26
28
  });
27
29
 
28
30
  interface RouterProviderProps {
29
- navigate: (path: string) => void,
31
+ navigate: (path: Href, routerOptions: RouterOptions | undefined) => void,
32
+ useHref?: (href: Href) => string,
30
33
  children: ReactNode
31
34
  }
32
35
 
@@ -35,20 +38,21 @@ interface RouterProviderProps {
35
38
  * and provides it to all nested React Aria links to enable client side navigation.
36
39
  */
37
40
  export function RouterProvider(props: RouterProviderProps) {
38
- let {children, navigate} = props;
41
+ let {children, navigate, useHref} = props;
39
42
 
40
43
  let ctx = useMemo(() => ({
41
44
  isNative: false,
42
- open: (target: Element, modifiers: Modifiers) => {
45
+ open: (target: Element, modifiers: Modifiers, href: Href, routerOptions: RouterOptions | undefined) => {
43
46
  getSyntheticLink(target, link => {
44
47
  if (shouldClientNavigate(link, modifiers)) {
45
- navigate(link.pathname + link.search + link.hash);
48
+ navigate(href, routerOptions);
46
49
  } else {
47
50
  openLink(link, modifiers);
48
51
  }
49
52
  });
50
- }
51
- }), [navigate]);
53
+ },
54
+ useHref: useHref || ((href) => href)
55
+ }), [navigate, useHref]);
52
56
 
53
57
  return (
54
58
  <RouterContext.Provider value={ctx}>
@@ -152,3 +156,15 @@ export function getSyntheticLinkProps(props: LinkDOMProps) {
152
156
  'data-referrer-policy': props.referrerPolicy
153
157
  };
154
158
  }
159
+
160
+ export function useLinkProps(props: LinkDOMProps) {
161
+ let router = useRouter();
162
+ return {
163
+ href: props?.href ? router.useHref(props?.href) : undefined,
164
+ target: props?.target,
165
+ rel: props?.rel,
166
+ download: props?.download,
167
+ ping: props?.ping,
168
+ referrerPolicy: props?.referrerPolicy
169
+ };
170
+ }
@@ -10,7 +10,7 @@
10
10
  * governing permissions and limitations under the License.
11
11
  */
12
12
 
13
- import {getScrollParent} from './';
13
+ import {getScrollParents} from './getScrollParents';
14
14
 
15
15
  interface ScrollIntoViewportOpts {
16
16
  /** The optional containing element of the target to be centered in the viewport. */
@@ -99,12 +99,10 @@ export function scrollIntoViewport(targetElement: Element, opts?: ScrollIntoView
99
99
  targetElement.scrollIntoView?.({block: 'nearest'});
100
100
  }
101
101
  } else {
102
- let scrollParent = getScrollParent(targetElement);
102
+ let scrollParents = getScrollParents(targetElement);
103
103
  // If scrolling is prevented, we don't want to scroll the body since it might move the overlay partially offscreen and the user can't scroll it back into view.
104
- while (targetElement && scrollParent && targetElement !== root && scrollParent !== root) {
104
+ for (let scrollParent of scrollParents) {
105
105
  scrollIntoView(scrollParent as HTMLElement, targetElement as HTMLElement);
106
- targetElement = scrollParent;
107
- scrollParent = getScrollParent(targetElement);
108
106
  }
109
107
  }
110
108
  }