react-aria-components 1.7.1 → 1.8.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 (127) hide show
  1. package/dist/Autocomplete.main.js.map +1 -1
  2. package/dist/Autocomplete.module.js.map +1 -1
  3. package/dist/Calendar.main.js +5 -7
  4. package/dist/Calendar.main.js.map +1 -1
  5. package/dist/Calendar.mjs +6 -8
  6. package/dist/Calendar.module.js +6 -8
  7. package/dist/Calendar.module.js.map +1 -1
  8. package/dist/Collection.main.js +1 -1
  9. package/dist/Collection.main.js.map +1 -1
  10. package/dist/Collection.mjs +1 -1
  11. package/dist/Collection.module.js +1 -1
  12. package/dist/Collection.module.js.map +1 -1
  13. package/dist/ColorPicker.main.js.map +1 -1
  14. package/dist/ColorPicker.module.js.map +1 -1
  15. package/dist/ColorWheel.main.js +3 -1
  16. package/dist/ColorWheel.main.js.map +1 -1
  17. package/dist/ColorWheel.mjs +3 -1
  18. package/dist/ColorWheel.module.js +3 -1
  19. package/dist/ColorWheel.module.js.map +1 -1
  20. package/dist/DateField.main.js +16 -9
  21. package/dist/DateField.main.js.map +1 -1
  22. package/dist/DateField.mjs +16 -9
  23. package/dist/DateField.module.js +16 -9
  24. package/dist/DateField.module.js.map +1 -1
  25. package/dist/Dialog.main.js +1 -1
  26. package/dist/Dialog.main.js.map +1 -1
  27. package/dist/Dialog.mjs +1 -1
  28. package/dist/Dialog.module.js +1 -1
  29. package/dist/Dialog.module.js.map +1 -1
  30. package/dist/DragAndDrop.main.js.map +1 -1
  31. package/dist/DragAndDrop.module.js.map +1 -1
  32. package/dist/GridList.main.js +2 -1
  33. package/dist/GridList.main.js.map +1 -1
  34. package/dist/GridList.mjs +2 -1
  35. package/dist/GridList.module.js +2 -1
  36. package/dist/GridList.module.js.map +1 -1
  37. package/dist/ListBox.main.js +2 -1
  38. package/dist/ListBox.main.js.map +1 -1
  39. package/dist/ListBox.mjs +2 -1
  40. package/dist/ListBox.module.js +2 -1
  41. package/dist/ListBox.module.js.map +1 -1
  42. package/dist/Menu.main.js.map +1 -1
  43. package/dist/Menu.module.js.map +1 -1
  44. package/dist/Modal.main.js.map +1 -1
  45. package/dist/Modal.module.js.map +1 -1
  46. package/dist/OverlayArrow.main.js +4 -1
  47. package/dist/OverlayArrow.main.js.map +1 -1
  48. package/dist/OverlayArrow.mjs +4 -1
  49. package/dist/OverlayArrow.module.js +4 -1
  50. package/dist/OverlayArrow.module.js.map +1 -1
  51. package/dist/Popover.main.js +1 -1
  52. package/dist/Popover.main.js.map +1 -1
  53. package/dist/Popover.mjs +1 -1
  54. package/dist/Popover.module.js +1 -1
  55. package/dist/Popover.module.js.map +1 -1
  56. package/dist/Separator.main.js +3 -2
  57. package/dist/Separator.main.js.map +1 -1
  58. package/dist/Separator.mjs +3 -2
  59. package/dist/Separator.module.js +3 -2
  60. package/dist/Separator.module.js.map +1 -1
  61. package/dist/Table.main.js +3 -2
  62. package/dist/Table.main.js.map +1 -1
  63. package/dist/Table.mjs +3 -2
  64. package/dist/Table.module.js +3 -2
  65. package/dist/Table.module.js.map +1 -1
  66. package/dist/TableLayout.main.js.map +1 -1
  67. package/dist/TableLayout.module.js.map +1 -1
  68. package/dist/TagGroup.main.js +1 -1
  69. package/dist/TagGroup.main.js.map +1 -1
  70. package/dist/TagGroup.mjs +1 -1
  71. package/dist/TagGroup.module.js +1 -1
  72. package/dist/TagGroup.module.js.map +1 -1
  73. package/dist/TextArea.main.js.map +1 -1
  74. package/dist/TextArea.module.js.map +1 -1
  75. package/dist/Toast.main.js +45 -16
  76. package/dist/Toast.main.js.map +1 -1
  77. package/dist/Toast.mjs +45 -18
  78. package/dist/Toast.module.js +45 -18
  79. package/dist/Toast.module.js.map +1 -1
  80. package/dist/Tooltip.main.js.map +1 -1
  81. package/dist/Tooltip.module.js.map +1 -1
  82. package/dist/Tree.main.js +2 -2
  83. package/dist/Tree.main.js.map +1 -1
  84. package/dist/Tree.mjs +2 -2
  85. package/dist/Tree.module.js +2 -2
  86. package/dist/Tree.module.js.map +1 -1
  87. package/dist/Virtualizer.main.js.map +1 -1
  88. package/dist/Virtualizer.module.js.map +1 -1
  89. package/dist/import.mjs +2 -2
  90. package/dist/main.js +2 -0
  91. package/dist/main.js.map +1 -1
  92. package/dist/module.js +2 -2
  93. package/dist/module.js.map +1 -1
  94. package/dist/types.d.ts +67 -39
  95. package/dist/types.d.ts.map +1 -1
  96. package/dist/utils.main.js.map +1 -1
  97. package/dist/utils.module.js.map +1 -1
  98. package/i18n/es-ES.js +1 -1
  99. package/i18n/es-ES.mjs +1 -1
  100. package/i18n/index.js +1 -1
  101. package/i18n/index.mjs +1 -1
  102. package/package.json +27 -25
  103. package/src/Autocomplete.tsx +2 -2
  104. package/src/Calendar.tsx +23 -11
  105. package/src/Collection.tsx +5 -2
  106. package/src/ColorPicker.tsx +2 -2
  107. package/src/ColorWheel.tsx +3 -1
  108. package/src/DateField.tsx +13 -9
  109. package/src/Dialog.tsx +2 -2
  110. package/src/DragAndDrop.tsx +4 -2
  111. package/src/GridList.tsx +4 -1
  112. package/src/ListBox.tsx +4 -1
  113. package/src/Menu.tsx +1 -1
  114. package/src/Modal.tsx +1 -0
  115. package/src/OverlayArrow.tsx +6 -3
  116. package/src/Popover.tsx +2 -1
  117. package/src/Separator.tsx +3 -2
  118. package/src/Table.tsx +8 -3
  119. package/src/TableLayout.ts +1 -1
  120. package/src/TagGroup.tsx +1 -1
  121. package/src/TextArea.tsx +1 -1
  122. package/src/Toast.tsx +51 -13
  123. package/src/Tooltip.tsx +2 -1
  124. package/src/Tree.tsx +2 -2
  125. package/src/Virtualizer.tsx +3 -3
  126. package/src/index.ts +3 -3
  127. package/src/utils.tsx +8 -1
package/src/Toast.tsx CHANGED
@@ -10,21 +10,28 @@
10
10
  * governing permissions and limitations under the License.
11
11
  */
12
12
 
13
- import {AriaToastProps, AriaToastRegionProps, mergeProps, useFocusRing, useToast, useToastRegion} from 'react-aria';
13
+ import {AriaToastProps, AriaToastRegionProps, mergeProps, useFocusRing, useHover, useLocale, useToast, useToastRegion} from 'react-aria';
14
14
  import {ButtonContext} from './Button';
15
15
  import {ContextValue, DEFAULT_SLOT, Provider, RenderProps, StyleRenderProps, useContextProps, useRenderProps} from './utils';
16
16
  import {createPortal} from 'react-dom';
17
17
  import {forwardRefType} from '@react-types/shared';
18
18
  import {QueuedToast, ToastQueue, ToastState, useToastQueue} from 'react-stately';
19
- import React, {createContext, ForwardedRef, forwardRef, HTMLAttributes, JSX, ReactElement, useContext} from 'react';
19
+ import React, {createContext, ForwardedRef, forwardRef, HTMLAttributes, JSX, ReactElement, ReactNode, useContext} from 'react';
20
20
  import {TextContext} from './Text';
21
+ import {useIsSSR} from '@react-aria/ssr';
21
22
  import {useObjectRef} from '@react-aria/utils';
23
+ import {useUNSAFE_PortalContext} from '@react-aria/overlays';
22
24
 
23
- const ToastStateContext = createContext<ToastState<any> | null>(null);
25
+ export const ToastStateContext = createContext<ToastState<any> | null>(null);
24
26
 
25
27
  export interface ToastRegionRenderProps<T> {
26
28
  /** A list of all currently visible toasts. */
27
29
  visibleToasts: QueuedToast<T>[],
30
+ /**
31
+ * Whether the toast region is currently hovered with a mouse.
32
+ * @selector [data-hovered]
33
+ */
34
+ isHovered: boolean,
28
35
  /**
29
36
  * Whether the toast region is currently focused.
30
37
  * @selector [data-focused]
@@ -40,54 +47,85 @@ export interface ToastRegionRenderProps<T> {
40
47
  export interface ToastRegionProps<T> extends AriaToastRegionProps, StyleRenderProps<ToastRegionRenderProps<T>> {
41
48
  /** The queue of toasts to display. */
42
49
  queue: ToastQueue<T>,
43
- /** A function to render each toast. */
44
- children: (renderProps: {toast: QueuedToast<T>}) => ReactElement
50
+ /** A function to render each toast, or children containing a `<ToastList>`. */
51
+ children: ReactNode | ((renderProps: {toast: QueuedToast<T>}) => ReactElement)
45
52
  }
46
53
 
47
54
  /**
48
55
  * A ToastRegion displays one or more toast notifications.
49
56
  */
50
57
  export const ToastRegion = /*#__PURE__*/ (forwardRef as forwardRefType)(function ToastRegion<T>(props: ToastRegionProps<T>, ref: ForwardedRef<HTMLDivElement>): JSX.Element | null {
58
+ let isSSR = useIsSSR();
51
59
  let state = useToastQueue(props.queue);
52
60
  let objectRef = useObjectRef(ref);
53
61
  let {regionProps} = useToastRegion(props, state, objectRef);
54
62
 
55
63
  let {focusProps, isFocused, isFocusVisible} = useFocusRing();
64
+ let {hoverProps, isHovered} = useHover({});
56
65
  let renderProps = useRenderProps({
57
66
  ...props,
58
67
  children: undefined,
59
68
  defaultClassName: 'react-aria-ToastRegion',
60
69
  values: {
61
70
  visibleToasts: state.visibleToasts,
71
+ isHovered,
62
72
  isFocused,
63
73
  isFocusVisible
64
74
  }
65
75
  });
66
76
 
77
+ let {direction} = useLocale();
78
+ let portalContainer;
79
+ let {getContainer} = useUNSAFE_PortalContext();
80
+ if (!isSSR) {
81
+ portalContainer = document.body;
82
+ if (getContainer) {
83
+ portalContainer = getContainer();
84
+ }
85
+ }
86
+
67
87
  let region = (
68
88
  <ToastStateContext.Provider value={state}>
69
89
  <div
70
90
  {...renderProps}
71
- {...mergeProps(regionProps, focusProps)}
91
+ {...mergeProps(regionProps, focusProps, hoverProps)}
92
+ dir={direction}
72
93
  ref={objectRef}
94
+ data-hovered={isHovered || undefined}
73
95
  data-focused={isFocused || undefined}
74
96
  data-focus-visible={isFocusVisible || undefined}>
75
- {typeof props.children === 'function' ? <ToastList {...props} style={{display: 'contents'}} /> : props.children}
97
+ {typeof props.children === 'function' ? <ToastList {...props} className={undefined} style={{display: 'contents'}}>{props.children}</ToastList> : props.children}
76
98
  </div>
77
99
  </ToastStateContext.Provider>
78
100
  );
79
101
 
80
- return state.visibleToasts.length > 0 && typeof document !== 'undefined'
81
- ? createPortal(region, document.body)
102
+ return state.visibleToasts.length > 0 && portalContainer
103
+ ? createPortal(region, portalContainer)
82
104
  : null;
83
105
  });
84
106
 
85
- // TODO: possibly export this so additional children can be added to the region, outside the list.
86
- const ToastList = /*#__PURE__*/ (forwardRef as forwardRefType)(function ToastList<T>(props: ToastRegionProps<T>, ref: ForwardedRef<HTMLOListElement>) {
107
+ export interface ToastListProps<T> extends Omit<ToastRegionProps<T>, 'queue' | 'children'> {
108
+ /** A function to render each toast. */
109
+ children: (renderProps: {toast: QueuedToast<T>}) => ReactElement
110
+ }
111
+
112
+ export const ToastList = /*#__PURE__*/ (forwardRef as forwardRefType)(function ToastList<T>(props: ToastListProps<T>, ref: ForwardedRef<HTMLOListElement>) {
87
113
  let state = useContext(ToastStateContext)!;
114
+ let {hoverProps, isHovered} = useHover({});
115
+ let renderProps = useRenderProps({
116
+ ...props,
117
+ children: undefined,
118
+ defaultClassName: 'react-aria-ToastList',
119
+ values: {
120
+ visibleToasts: state.visibleToasts,
121
+ isFocused: false,
122
+ isFocusVisible: false,
123
+ isHovered
124
+ }
125
+ });
126
+
88
127
  return (
89
- // @ts-ignore
90
- <ol ref={ref} style={props.style} className={props.className}>
128
+ <ol {...hoverProps} {...renderProps} ref={ref}>
91
129
  {state.visibleToasts.map((toast) => (
92
130
  <li key={toast.key} style={{display: 'contents'}}>
93
131
  {props.children({toast})}
package/src/Tooltip.tsx CHANGED
@@ -41,6 +41,7 @@ export interface TooltipProps extends PositionProps, Pick<AriaPositionProps, 'ar
41
41
  /**
42
42
  * The container element in which the overlay portal will be placed. This may have unknown behavior depending on where it is portalled to.
43
43
  * @default document.body
44
+ * @deprecated - Use a parent UNSAFE_PortalProvider to set your portal container instead.
44
45
  */
45
46
  UNSTABLE_portalContainer?: Element,
46
47
  /**
@@ -80,7 +81,7 @@ export const TooltipContext = createContext<ContextValue<TooltipProps, HTMLDivEl
80
81
  * the Tooltip when the user hovers over or focuses the trigger, and positioning the Tooltip
81
82
  * relative to the trigger.
82
83
  */
83
- export function TooltipTrigger(props: TooltipTriggerComponentProps) {
84
+ export function TooltipTrigger(props: TooltipTriggerComponentProps): ReactNode {
84
85
  let state = useTooltipTriggerState(props);
85
86
  let ref = useRef<FocusableElement>(null);
86
87
  let {triggerProps, tooltipProps} = useTooltipTrigger(props, state, ref);
package/src/Tree.tsx CHANGED
@@ -384,14 +384,14 @@ export const TreeItem = /*#__PURE__*/ createBranchComponent('item', <T extends o
384
384
  });
385
385
 
386
386
  useEffect(() => {
387
- if (!item.textValue) {
387
+ if (!item.textValue && process.env.NODE_ENV !== 'production') {
388
388
  console.warn('A `textValue` prop is required for <TreeItem> elements in order to support accessibility features such as type to select.');
389
389
  }
390
390
  }, [item.textValue]);
391
391
 
392
392
  let expandButtonRef = useRef<HTMLButtonElement>(null);
393
393
  useEffect(() => {
394
- if (hasChildItems && !expandButtonRef.current) {
394
+ if (hasChildItems && !expandButtonRef.current && process.env.NODE_ENV !== 'production') {
395
395
  console.warn('Expandable tree items must contain a expand button so screen reader users can expand/collapse the item.');
396
396
  }
397
397
  // eslint-disable-next-line
@@ -13,7 +13,7 @@
13
13
  import {CollectionBranchProps, CollectionRenderer, CollectionRendererContext, CollectionRootProps} from './Collection';
14
14
  import {DropPosition, DropTarget, DropTargetDelegate, ItemDropTarget, Node} from '@react-types/shared';
15
15
  import {Layout, ReusableView, useVirtualizerState, VirtualizerState} from '@react-stately/virtualizer';
16
- import React, {createContext, ReactElement, ReactNode, useContext, useMemo} from 'react';
16
+ import React, {createContext, ReactNode, useContext, useMemo} from 'react';
17
17
  import {useScrollView, VirtualizerItem} from '@react-aria/virtualizer';
18
18
 
19
19
  type View = ReusableView<Node<unknown>, ReactNode>;
@@ -50,7 +50,7 @@ const LayoutContext = createContext<LayoutContextValue | null>(null);
50
50
  * It supports very large collections by only rendering visible items to the DOM, reusing
51
51
  * them as the user scrolls.
52
52
  */
53
- export function Virtualizer<O>(props: VirtualizerProps<O>) {
53
+ export function Virtualizer<O>(props: VirtualizerProps<O>): ReactNode {
54
54
  let {children, layout: layoutProp, layoutOptions} = props;
55
55
  let layout = useMemo(() => typeof layoutProp === 'function' ? new layoutProp() : layoutProp, [layoutProp]);
56
56
  let renderer: CollectionRenderer = useMemo(() => ({
@@ -129,7 +129,7 @@ function renderWrapper(
129
129
  parent: View | null,
130
130
  reusableView: View,
131
131
  renderDropIndicator?: (target: ItemDropTarget) => ReactNode
132
- ): ReactElement {
132
+ ): ReactNode {
133
133
  let rendered = (
134
134
  <VirtualizerItem
135
135
  key={reusableView.key}
package/src/index.ts CHANGED
@@ -70,7 +70,7 @@ export {TagGroup, TagGroupContext, TagList, TagListContext, Tag} from './TagGrou
70
70
  export {Text, TextContext} from './Text';
71
71
  export {TextArea, TextAreaContext} from './TextArea';
72
72
  export {TextField, TextFieldContext} from './TextField';
73
- export {Toast as UNSTABLE_Toast, ToastRegion as UNSTABLE_ToastRegion, ToastContent as UNSTABLE_ToastContent} from './Toast';
73
+ export {Toast as UNSTABLE_Toast, ToastList as UNSTABLE_ToastList, ToastRegion as UNSTABLE_ToastRegion, ToastContent as UNSTABLE_ToastContent, ToastStateContext as UNSTABLE_ToastStateContext} from './Toast';
74
74
  export {ToggleButton, ToggleButtonContext} from './ToggleButton';
75
75
  export {ToggleButtonGroup, ToggleButtonGroupContext, ToggleGroupStateContext} from './ToggleButtonGroup';
76
76
  export {Toolbar, ToolbarContext} from './Toolbar';
@@ -133,7 +133,7 @@ export type {TagGroupProps, TagListProps, TagListRenderProps, TagProps, TagRende
133
133
  export type {TextAreaProps} from './TextArea';
134
134
  export type {TextFieldProps, TextFieldRenderProps} from './TextField';
135
135
  export type {TextProps} from './Text';
136
- export type {ToastRegionProps, ToastRegionRenderProps, ToastProps, ToastRenderProps} from './Toast';
136
+ export type {ToastRegionProps, ToastListProps, ToastRegionRenderProps, ToastProps, ToastRenderProps} from './Toast';
137
137
  export type {ToggleButtonProps, ToggleButtonRenderProps} from './ToggleButton';
138
138
  export type {ToggleButtonGroupProps, ToggleButtonGroupRenderProps} from './ToggleButtonGroup';
139
139
  export type {ToolbarProps, ToolbarRenderProps} from './Toolbar';
@@ -146,6 +146,6 @@ export type {VirtualizerProps} from './Virtualizer';
146
146
 
147
147
  export type {DateValue, DateRange, TimeValue} from 'react-aria';
148
148
  export type {DirectoryDropItem, DraggableCollectionEndEvent, DraggableCollectionMoveEvent, DraggableCollectionStartEvent, DragPreviewRenderer, DragTypes, DropItem, DropOperation, DroppableCollectionDropEvent, DroppableCollectionEnterEvent, DroppableCollectionExitEvent, DroppableCollectionInsertDropEvent, DroppableCollectionMoveEvent, DroppableCollectionOnItemDropEvent, DroppableCollectionReorderEvent, DroppableCollectionRootDropEvent, DropPosition, DropTarget, FileDropItem, ItemDropTarget, RootDropTarget, TextDropItem, PressEvent} from 'react-aria';
149
- export type {Color, ColorSpace, ColorFormat, Key, Selection, SortDescriptor, SortDirection, SelectionMode, ToastOptions} from 'react-stately';
149
+ export type {Color, ColorSpace, ColorFormat, Key, QueuedToast, Selection, SortDescriptor, SortDirection, SelectionMode, ToastOptions} from 'react-stately';
150
150
  export type {ValidationResult, RouterConfig} from '@react-types/shared';
151
151
  export type {ListLayoutOptions, GridLayoutOptions, WaterfallLayoutOptions} from '@react-stately/layout';
package/src/utils.tsx CHANGED
@@ -87,7 +87,14 @@ interface RenderPropsHookOptions<T> extends RenderProps<T>, SharedDOMProps, Aria
87
87
  defaultStyle?: CSSProperties
88
88
  }
89
89
 
90
- export function useRenderProps<T>(props: RenderPropsHookOptions<T>) {
90
+ interface RenderPropsHookRetVal {
91
+ className?: string,
92
+ style?: CSSProperties,
93
+ children?: ReactNode,
94
+ 'data-rac': string
95
+ }
96
+
97
+ export function useRenderProps<T>(props: RenderPropsHookOptions<T>): RenderPropsHookRetVal {
91
98
  let {
92
99
  className,
93
100
  style,