react-aria-components 1.10.1 → 1.11.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 (302) hide show
  1. package/dist/Breadcrumbs.main.js +9 -2
  2. package/dist/Breadcrumbs.main.js.map +1 -1
  3. package/dist/Breadcrumbs.mjs +10 -3
  4. package/dist/Breadcrumbs.module.js +10 -3
  5. package/dist/Breadcrumbs.module.js.map +1 -1
  6. package/dist/Button.main.js +7 -17
  7. package/dist/Button.main.js.map +1 -1
  8. package/dist/Button.mjs +7 -17
  9. package/dist/Button.module.js +7 -17
  10. package/dist/Button.module.js.map +1 -1
  11. package/dist/Calendar.main.js +36 -14
  12. package/dist/Calendar.main.js.map +1 -1
  13. package/dist/Calendar.mjs +38 -16
  14. package/dist/Calendar.module.js +38 -16
  15. package/dist/Calendar.module.js.map +1 -1
  16. package/dist/Checkbox.main.js +8 -3
  17. package/dist/Checkbox.main.js.map +1 -1
  18. package/dist/Checkbox.mjs +10 -5
  19. package/dist/Checkbox.module.js +10 -5
  20. package/dist/Checkbox.module.js.map +1 -1
  21. package/dist/Collection.main.js.map +1 -1
  22. package/dist/Collection.module.js.map +1 -1
  23. package/dist/ColorArea.main.js +4 -4
  24. package/dist/ColorArea.main.js.map +1 -1
  25. package/dist/ColorArea.mjs +5 -5
  26. package/dist/ColorArea.module.js +5 -5
  27. package/dist/ColorArea.module.js.map +1 -1
  28. package/dist/ColorField.main.js +14 -1
  29. package/dist/ColorField.main.js.map +1 -1
  30. package/dist/ColorField.mjs +14 -1
  31. package/dist/ColorField.module.js +14 -1
  32. package/dist/ColorField.module.js.map +1 -1
  33. package/dist/ColorSlider.main.js +3 -1
  34. package/dist/ColorSlider.main.js.map +1 -1
  35. package/dist/ColorSlider.mjs +3 -1
  36. package/dist/ColorSlider.module.js +3 -1
  37. package/dist/ColorSlider.module.js.map +1 -1
  38. package/dist/ColorSwatch.main.js +6 -2
  39. package/dist/ColorSwatch.main.js.map +1 -1
  40. package/dist/ColorSwatch.mjs +6 -2
  41. package/dist/ColorSwatch.module.js +6 -2
  42. package/dist/ColorSwatch.module.js.map +1 -1
  43. package/dist/ColorSwatchPicker.main.js.map +1 -1
  44. package/dist/ColorSwatchPicker.module.js.map +1 -1
  45. package/dist/ColorThumb.main.js +3 -1
  46. package/dist/ColorThumb.main.js.map +1 -1
  47. package/dist/ColorThumb.mjs +3 -1
  48. package/dist/ColorThumb.module.js +3 -1
  49. package/dist/ColorThumb.module.js.map +1 -1
  50. package/dist/ColorWheel.main.js +3 -1
  51. package/dist/ColorWheel.main.js.map +1 -1
  52. package/dist/ColorWheel.mjs +3 -1
  53. package/dist/ColorWheel.module.js +3 -1
  54. package/dist/ColorWheel.module.js.map +1 -1
  55. package/dist/ComboBox.main.js +4 -1
  56. package/dist/ComboBox.main.js.map +1 -1
  57. package/dist/ComboBox.mjs +4 -1
  58. package/dist/ComboBox.module.js +4 -1
  59. package/dist/ComboBox.module.js.map +1 -1
  60. package/dist/DateField.main.js +16 -3
  61. package/dist/DateField.main.js.map +1 -1
  62. package/dist/DateField.mjs +16 -3
  63. package/dist/DateField.module.js +16 -3
  64. package/dist/DateField.module.js.map +1 -1
  65. package/dist/DatePicker.main.js +15 -8
  66. package/dist/DatePicker.main.js.map +1 -1
  67. package/dist/DatePicker.mjs +16 -9
  68. package/dist/DatePicker.module.js +16 -9
  69. package/dist/DatePicker.module.js.map +1 -1
  70. package/dist/Dialog.main.js +4 -3
  71. package/dist/Dialog.main.js.map +1 -1
  72. package/dist/Dialog.mjs +5 -4
  73. package/dist/Dialog.module.js +5 -4
  74. package/dist/Dialog.module.js.map +1 -1
  75. package/dist/Disclosure.main.js +12 -10
  76. package/dist/Disclosure.main.js.map +1 -1
  77. package/dist/Disclosure.mjs +13 -11
  78. package/dist/Disclosure.module.js +13 -11
  79. package/dist/Disclosure.module.js.map +1 -1
  80. package/dist/DragAndDrop.main.js +31 -3
  81. package/dist/DragAndDrop.main.js.map +1 -1
  82. package/dist/DragAndDrop.mjs +31 -3
  83. package/dist/DragAndDrop.module.js +31 -3
  84. package/dist/DragAndDrop.module.js.map +1 -1
  85. package/dist/DropZone.main.js +4 -3
  86. package/dist/DropZone.main.js.map +1 -1
  87. package/dist/DropZone.mjs +4 -3
  88. package/dist/DropZone.module.js +4 -3
  89. package/dist/DropZone.module.js.map +1 -1
  90. package/dist/FieldError.main.js +3 -1
  91. package/dist/FieldError.main.js.map +1 -1
  92. package/dist/FieldError.mjs +3 -1
  93. package/dist/FieldError.module.js +3 -1
  94. package/dist/FieldError.module.js.map +1 -1
  95. package/dist/FileTrigger.main.js +3 -1
  96. package/dist/FileTrigger.main.js.map +1 -1
  97. package/dist/FileTrigger.mjs +3 -1
  98. package/dist/FileTrigger.module.js +3 -1
  99. package/dist/FileTrigger.module.js.map +1 -1
  100. package/dist/Form.main.js.map +1 -1
  101. package/dist/Form.module.js.map +1 -1
  102. package/dist/GridList.main.js +20 -13
  103. package/dist/GridList.main.js.map +1 -1
  104. package/dist/GridList.mjs +21 -14
  105. package/dist/GridList.module.js +21 -14
  106. package/dist/GridList.module.js.map +1 -1
  107. package/dist/HiddenDateInput.main.js +118 -0
  108. package/dist/HiddenDateInput.main.js.map +1 -0
  109. package/dist/HiddenDateInput.mjs +109 -0
  110. package/dist/HiddenDateInput.module.js +109 -0
  111. package/dist/HiddenDateInput.module.js.map +1 -0
  112. package/dist/Link.main.js +7 -1
  113. package/dist/Link.main.js.map +1 -1
  114. package/dist/Link.mjs +7 -1
  115. package/dist/Link.module.js +7 -1
  116. package/dist/Link.module.js.map +1 -1
  117. package/dist/ListBox.main.js +22 -19
  118. package/dist/ListBox.main.js.map +1 -1
  119. package/dist/ListBox.mjs +23 -20
  120. package/dist/ListBox.module.js +23 -20
  121. package/dist/ListBox.module.js.map +1 -1
  122. package/dist/Menu.main.js +15 -8
  123. package/dist/Menu.main.js.map +1 -1
  124. package/dist/Menu.mjs +16 -9
  125. package/dist/Menu.module.js +16 -9
  126. package/dist/Menu.module.js.map +1 -1
  127. package/dist/Meter.main.js +6 -2
  128. package/dist/Meter.main.js.map +1 -1
  129. package/dist/Meter.mjs +6 -2
  130. package/dist/Meter.module.js +6 -2
  131. package/dist/Meter.module.js.map +1 -1
  132. package/dist/Modal.main.js +31 -6
  133. package/dist/Modal.main.js.map +1 -1
  134. package/dist/Modal.mjs +31 -6
  135. package/dist/Modal.module.js +31 -6
  136. package/dist/Modal.module.js.map +1 -1
  137. package/dist/NumberField.main.js +4 -1
  138. package/dist/NumberField.main.js.map +1 -1
  139. package/dist/NumberField.mjs +4 -1
  140. package/dist/NumberField.module.js +4 -1
  141. package/dist/NumberField.module.js.map +1 -1
  142. package/dist/Popover.main.js +3 -1
  143. package/dist/Popover.main.js.map +1 -1
  144. package/dist/Popover.mjs +3 -1
  145. package/dist/Popover.module.js +3 -1
  146. package/dist/Popover.module.js.map +1 -1
  147. package/dist/ProgressBar.main.js +6 -2
  148. package/dist/ProgressBar.main.js.map +1 -1
  149. package/dist/ProgressBar.mjs +6 -2
  150. package/dist/ProgressBar.module.js +6 -2
  151. package/dist/ProgressBar.module.js.map +1 -1
  152. package/dist/RadioGroup.main.js +8 -3
  153. package/dist/RadioGroup.main.js.map +1 -1
  154. package/dist/RadioGroup.mjs +9 -4
  155. package/dist/RadioGroup.module.js +9 -4
  156. package/dist/RadioGroup.module.js.map +1 -1
  157. package/dist/SearchField.main.js +3 -1
  158. package/dist/SearchField.main.js.map +1 -1
  159. package/dist/SearchField.mjs +3 -1
  160. package/dist/SearchField.module.js +3 -1
  161. package/dist/SearchField.module.js.map +1 -1
  162. package/dist/Select.main.js +12 -14
  163. package/dist/Select.main.js.map +1 -1
  164. package/dist/Select.mjs +13 -15
  165. package/dist/Select.module.js +13 -15
  166. package/dist/Select.module.js.map +1 -1
  167. package/dist/Separator.main.js +4 -2
  168. package/dist/Separator.main.js.map +1 -1
  169. package/dist/Separator.mjs +5 -3
  170. package/dist/Separator.module.js +5 -3
  171. package/dist/Separator.module.js.map +1 -1
  172. package/dist/Slider.main.js +7 -5
  173. package/dist/Slider.main.js.map +1 -1
  174. package/dist/Slider.mjs +8 -6
  175. package/dist/Slider.module.js +8 -6
  176. package/dist/Slider.module.js.map +1 -1
  177. package/dist/Switch.main.js +4 -1
  178. package/dist/Switch.main.js.map +1 -1
  179. package/dist/Switch.mjs +4 -1
  180. package/dist/Switch.module.js +4 -1
  181. package/dist/Switch.module.js.map +1 -1
  182. package/dist/Table.main.js +47 -26
  183. package/dist/Table.main.js.map +1 -1
  184. package/dist/Table.mjs +48 -27
  185. package/dist/Table.module.js +48 -27
  186. package/dist/Table.module.js.map +1 -1
  187. package/dist/Tabs.main.js +20 -10
  188. package/dist/Tabs.main.js.map +1 -1
  189. package/dist/Tabs.mjs +21 -11
  190. package/dist/Tabs.module.js +21 -11
  191. package/dist/Tabs.module.js.map +1 -1
  192. package/dist/TagGroup.main.js +14 -8
  193. package/dist/TagGroup.main.js.map +1 -1
  194. package/dist/TagGroup.mjs +14 -8
  195. package/dist/TagGroup.module.js +14 -8
  196. package/dist/TagGroup.module.js.map +1 -1
  197. package/dist/TextField.main.js +13 -1
  198. package/dist/TextField.main.js.map +1 -1
  199. package/dist/TextField.mjs +13 -1
  200. package/dist/TextField.module.js +13 -1
  201. package/dist/TextField.module.js.map +1 -1
  202. package/dist/Toast.main.js +9 -5
  203. package/dist/Toast.main.js.map +1 -1
  204. package/dist/Toast.mjs +9 -5
  205. package/dist/Toast.module.js +9 -5
  206. package/dist/Toast.module.js.map +1 -1
  207. package/dist/ToggleButton.main.js +8 -2
  208. package/dist/ToggleButton.main.js.map +1 -1
  209. package/dist/ToggleButton.mjs +8 -2
  210. package/dist/ToggleButton.module.js +8 -2
  211. package/dist/ToggleButton.module.js.map +1 -1
  212. package/dist/ToggleButtonGroup.main.js +6 -2
  213. package/dist/ToggleButtonGroup.main.js.map +1 -1
  214. package/dist/ToggleButtonGroup.mjs +6 -2
  215. package/dist/ToggleButtonGroup.module.js +6 -2
  216. package/dist/ToggleButtonGroup.module.js.map +1 -1
  217. package/dist/Toolbar.main.js +4 -3
  218. package/dist/Toolbar.main.js.map +1 -1
  219. package/dist/Toolbar.mjs +4 -3
  220. package/dist/Toolbar.module.js +4 -3
  221. package/dist/Toolbar.module.js.map +1 -1
  222. package/dist/Tooltip.main.js +5 -3
  223. package/dist/Tooltip.main.js.map +1 -1
  224. package/dist/Tooltip.mjs +5 -3
  225. package/dist/Tooltip.module.js +5 -3
  226. package/dist/Tooltip.module.js.map +1 -1
  227. package/dist/Tree.main.js +73 -26
  228. package/dist/Tree.main.js.map +1 -1
  229. package/dist/Tree.mjs +74 -27
  230. package/dist/Tree.module.js +74 -27
  231. package/dist/Tree.module.js.map +1 -1
  232. package/dist/TreeDropTargetDelegate.main.js +8 -5
  233. package/dist/TreeDropTargetDelegate.main.js.map +1 -1
  234. package/dist/TreeDropTargetDelegate.mjs +8 -5
  235. package/dist/TreeDropTargetDelegate.module.js +8 -5
  236. package/dist/TreeDropTargetDelegate.module.js.map +1 -1
  237. package/dist/import.mjs +5 -5
  238. package/dist/main.js +4 -4
  239. package/dist/main.js.map +1 -1
  240. package/dist/module.js +5 -5
  241. package/dist/module.js.map +1 -1
  242. package/dist/types.d.ts +212 -203
  243. package/dist/types.d.ts.map +1 -1
  244. package/dist/useDragAndDrop.main.js.map +1 -1
  245. package/dist/useDragAndDrop.module.js.map +1 -1
  246. package/dist/utils.main.js.map +1 -1
  247. package/dist/utils.module.js.map +1 -1
  248. package/i18n/de-DE.js +1 -1
  249. package/i18n/de-DE.mjs +1 -1
  250. package/package.json +25 -25
  251. package/src/Breadcrumbs.tsx +10 -6
  252. package/src/Button.tsx +8 -30
  253. package/src/Calendar.tsx +41 -24
  254. package/src/Checkbox.tsx +8 -6
  255. package/src/Collection.tsx +2 -2
  256. package/src/ColorArea.tsx +5 -6
  257. package/src/ColorField.tsx +6 -4
  258. package/src/ColorSlider.tsx +3 -2
  259. package/src/ColorSwatch.tsx +6 -3
  260. package/src/ColorSwatchPicker.tsx +3 -3
  261. package/src/ColorThumb.tsx +3 -3
  262. package/src/ColorWheel.tsx +6 -5
  263. package/src/ComboBox.tsx +4 -4
  264. package/src/DateField.tsx +15 -10
  265. package/src/DatePicker.tsx +14 -12
  266. package/src/Dialog.tsx +6 -6
  267. package/src/Disclosure.tsx +10 -14
  268. package/src/DragAndDrop.tsx +31 -1
  269. package/src/DropZone.tsx +4 -5
  270. package/src/FieldError.tsx +3 -3
  271. package/src/FileTrigger.tsx +4 -3
  272. package/src/Form.tsx +2 -1
  273. package/src/GridList.tsx +25 -18
  274. package/src/HiddenDateInput.tsx +142 -0
  275. package/src/Link.tsx +7 -3
  276. package/src/ListBox.tsx +30 -26
  277. package/src/Menu.tsx +15 -12
  278. package/src/Meter.tsx +6 -3
  279. package/src/Modal.tsx +16 -5
  280. package/src/NumberField.tsx +4 -4
  281. package/src/Popover.tsx +3 -3
  282. package/src/ProgressBar.tsx +6 -2
  283. package/src/RadioGroup.tsx +8 -6
  284. package/src/SearchField.tsx +3 -2
  285. package/src/Select.tsx +13 -16
  286. package/src/Separator.tsx +6 -4
  287. package/src/Slider.tsx +9 -11
  288. package/src/Switch.tsx +4 -3
  289. package/src/Table.tsx +58 -56
  290. package/src/Tabs.tsx +18 -15
  291. package/src/TagGroup.tsx +13 -12
  292. package/src/TextField.tsx +5 -2
  293. package/src/Toast.tsx +10 -8
  294. package/src/ToggleButton.tsx +8 -4
  295. package/src/ToggleButtonGroup.tsx +6 -4
  296. package/src/Toolbar.tsx +4 -5
  297. package/src/Tooltip.tsx +6 -5
  298. package/src/Tree.tsx +90 -42
  299. package/src/TreeDropTargetDelegate.ts +5 -1
  300. package/src/index.ts +8 -8
  301. package/src/useDragAndDrop.tsx +2 -2
  302. package/src/utils.tsx +9 -9
package/src/Toast.tsx CHANGED
@@ -14,12 +14,12 @@ import {AriaToastProps, AriaToastRegionProps, mergeProps, useFocusRing, useHover
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
- import {forwardRefType} from '@react-types/shared';
17
+ import {filterDOMProps, useObjectRef} from '@react-aria/utils';
18
+ import {forwardRefType, GlobalDOMAttributes} from '@react-types/shared';
18
19
  import {QueuedToast, ToastQueue, ToastState, useToastQueue} from 'react-stately';
19
20
  import React, {createContext, ForwardedRef, forwardRef, HTMLAttributes, JSX, ReactElement, ReactNode, useContext} from 'react';
20
21
  import {TextContext} from './Text';
21
22
  import {useIsSSR} from '@react-aria/ssr';
22
- import {useObjectRef} from '@react-aria/utils';
23
23
  import {useUNSAFE_PortalContext} from '@react-aria/overlays';
24
24
 
25
25
  export const ToastStateContext = createContext<ToastState<any> | null>(null);
@@ -44,7 +44,7 @@ export interface ToastRegionRenderProps<T> {
44
44
  isFocusVisible: boolean
45
45
  }
46
46
 
47
- export interface ToastRegionProps<T> extends AriaToastRegionProps, StyleRenderProps<ToastRegionRenderProps<T>> {
47
+ export interface ToastRegionProps<T> extends AriaToastRegionProps, StyleRenderProps<ToastRegionRenderProps<T>>, GlobalDOMAttributes<HTMLDivElement> {
48
48
  /** The queue of toasts to display. */
49
49
  queue: ToastQueue<T>,
50
50
  /** A function to render each toast, or children containing a `<ToastList>`. */
@@ -84,11 +84,12 @@ export const ToastRegion = /*#__PURE__*/ (forwardRef as forwardRefType)(function
84
84
  }
85
85
  }
86
86
 
87
+ let DOMProps = filterDOMProps(props, {global: true});
88
+
87
89
  let region = (
88
90
  <ToastStateContext.Provider value={state}>
89
91
  <div
90
- {...renderProps}
91
- {...mergeProps(regionProps, focusProps, hoverProps)}
92
+ {...mergeProps(DOMProps, renderProps, regionProps, focusProps, hoverProps)}
92
93
  dir={direction}
93
94
  ref={objectRef}
94
95
  data-hovered={isHovered || undefined}
@@ -152,7 +153,7 @@ export interface ToastRenderProps<T> {
152
153
  isFocusVisible: boolean
153
154
  }
154
155
 
155
- export interface ToastProps<T> extends AriaToastProps<T>, RenderProps<ToastRenderProps<T>> {}
156
+ export interface ToastProps<T> extends AriaToastProps<T>, RenderProps<ToastRenderProps<T>>, GlobalDOMAttributes<HTMLDivElement> {}
156
157
 
157
158
  /**
158
159
  * A Toast displays a brief, temporary notification of actions, errors, or other events in an application.
@@ -177,10 +178,11 @@ export const Toast = /*#__PURE__*/ (forwardRef as forwardRefType)(function Toast
177
178
  }
178
179
  });
179
180
 
181
+ let DOMProps = filterDOMProps(props, {global: true});
182
+
180
183
  return (
181
184
  <div
182
- {...renderProps}
183
- {...mergeProps(toastProps, focusProps)}
185
+ {...mergeProps(DOMProps, renderProps, toastProps, focusProps)}
184
186
  ref={objectRef}
185
187
  data-focused={isFocused || undefined}
186
188
  data-focus-visible={isFocusVisible || undefined}>
@@ -13,7 +13,8 @@
13
13
  import {AriaToggleButtonProps, HoverEvents, mergeProps, useFocusRing, useHover, useToggleButton, useToggleButtonGroupItem} from 'react-aria';
14
14
  import {ButtonRenderProps} from './Button';
15
15
  import {ContextValue, RenderProps, SlotProps, useContextProps, useRenderProps} from './utils';
16
- import {forwardRefType, Key} from '@react-types/shared';
16
+ import {filterDOMProps} from '@react-aria/utils';
17
+ import {forwardRefType, GlobalDOMAttributes, Key} from '@react-types/shared';
17
18
  import React, {createContext, ForwardedRef, forwardRef, useContext} from 'react';
18
19
  import {ToggleGroupStateContext} from './ToggleButtonGroup';
19
20
  import {ToggleState, useToggleState} from 'react-stately';
@@ -30,7 +31,7 @@ export interface ToggleButtonRenderProps extends Omit<ButtonRenderProps, 'isPend
30
31
  state: ToggleState
31
32
  }
32
33
 
33
- export interface ToggleButtonProps extends Omit<AriaToggleButtonProps, 'children' | 'elementType' | 'id'>, HoverEvents, SlotProps, RenderProps<ToggleButtonRenderProps> {
34
+ export interface ToggleButtonProps extends Omit<AriaToggleButtonProps, 'children' | 'elementType' | 'id'>, HoverEvents, SlotProps, RenderProps<ToggleButtonRenderProps>, Omit<GlobalDOMAttributes<HTMLDivElement>, 'onClick'> {
34
35
  /** When used in a ToggleButtonGroup, an identifier for the item in `selectedKeys`. When used standalone, a DOM id. */
35
36
  id?: Key
36
37
  }
@@ -65,10 +66,13 @@ export const ToggleButton = /*#__PURE__*/ (forwardRef as forwardRefType)(functio
65
66
  defaultClassName: 'react-aria-ToggleButton'
66
67
  });
67
68
 
69
+ let DOMProps = filterDOMProps(props as any, {global: true});
70
+ delete DOMProps.id;
71
+ delete DOMProps.onClick;
72
+
68
73
  return (
69
74
  <button
70
- {...mergeProps(buttonProps, focusProps, hoverProps)}
71
- {...renderProps}
75
+ {...mergeProps(DOMProps, renderProps, buttonProps, focusProps, hoverProps)}
72
76
  ref={ref}
73
77
  slot={props.slot || undefined}
74
78
  data-focused={isFocused || undefined}
@@ -11,7 +11,8 @@
11
11
  */
12
12
  import {AriaToggleButtonGroupProps, useToggleButtonGroup} from 'react-aria';
13
13
  import {ContextValue, RenderProps, SlotProps, useContextProps, useRenderProps} from './utils';
14
- import {forwardRefType} from '@react-types/shared';
14
+ import {filterDOMProps, mergeProps} from '@react-aria/utils';
15
+ import {forwardRefType, GlobalDOMAttributes} from '@react-types/shared';
15
16
  import React, {createContext, ForwardedRef, forwardRef} from 'react';
16
17
  import {ToggleGroupState, useToggleGroupState} from 'react-stately';
17
18
 
@@ -27,7 +28,7 @@ export interface ToggleButtonGroupRenderProps {
27
28
  state: ToggleGroupState
28
29
  }
29
30
 
30
- export interface ToggleButtonGroupProps extends AriaToggleButtonGroupProps, RenderProps<ToggleButtonGroupRenderProps>, SlotProps {}
31
+ export interface ToggleButtonGroupProps extends AriaToggleButtonGroupProps, RenderProps<ToggleButtonGroupRenderProps>, SlotProps, GlobalDOMAttributes<HTMLDivElement> {}
31
32
 
32
33
  export const ToggleButtonGroupContext = createContext<ContextValue<ToggleButtonGroupProps, HTMLDivElement>>({});
33
34
  export const ToggleGroupStateContext = createContext<ToggleGroupState | null>(null);
@@ -49,10 +50,11 @@ export const ToggleButtonGroup = /*#__PURE__*/ (forwardRef as forwardRefType)(fu
49
50
  defaultClassName: 'react-aria-ToggleButtonGroup'
50
51
  });
51
52
 
53
+ let DOMProps = filterDOMProps(props, {global: true});
54
+
52
55
  return (
53
56
  <div
54
- {...groupProps}
55
- {...renderProps}
57
+ {...mergeProps(DOMProps, renderProps, groupProps)}
56
58
  ref={ref}
57
59
  slot={props.slot || undefined}
58
60
  data-orientation={props.orientation || 'horizontal'}
package/src/Toolbar.tsx CHANGED
@@ -13,7 +13,7 @@
13
13
  import {AriaToolbarProps, useToolbar} from '@react-aria/toolbar';
14
14
  import {ContextValue, RenderProps, SlotProps, useContextProps, useRenderProps} from './utils';
15
15
  import {filterDOMProps, mergeProps} from '@react-aria/utils';
16
- import {forwardRefType, Orientation} from '@react-types/shared';
16
+ import {forwardRefType, GlobalDOMAttributes, Orientation} from '@react-types/shared';
17
17
  import React, {createContext, ForwardedRef, forwardRef} from 'react';
18
18
 
19
19
  export interface ToolbarRenderProps {
@@ -24,7 +24,7 @@ export interface ToolbarRenderProps {
24
24
  orientation: Orientation
25
25
  }
26
26
 
27
- export interface ToolbarProps extends AriaToolbarProps, SlotProps, RenderProps<ToolbarRenderProps> {
27
+ export interface ToolbarProps extends AriaToolbarProps, SlotProps, RenderProps<ToolbarRenderProps>, GlobalDOMAttributes<HTMLDivElement> {
28
28
  }
29
29
 
30
30
  export const ToolbarContext = createContext<ContextValue<ToolbarProps, HTMLDivElement>>({});
@@ -41,13 +41,12 @@ export const Toolbar = /*#__PURE__*/ (forwardRef as forwardRefType)(function Too
41
41
  values: {orientation: props.orientation || 'horizontal'},
42
42
  defaultClassName: 'react-aria-Toolbar'
43
43
  });
44
- let DOMProps = filterDOMProps(props);
44
+ let DOMProps = filterDOMProps(props, {global: true});
45
45
  delete DOMProps.id;
46
46
 
47
47
  return (
48
48
  <div
49
- {...mergeProps(toolbarProps, DOMProps)}
50
- {...renderProps}
49
+ {...mergeProps(DOMProps, renderProps, toolbarProps)}
51
50
  ref={ref}
52
51
  slot={props.slot || undefined}
53
52
  data-orientation={props.orientation || 'horizontal'}>
package/src/Tooltip.tsx CHANGED
@@ -10,20 +10,20 @@
10
10
  * governing permissions and limitations under the License.
11
11
  */
12
12
 
13
- import {AriaLabelingProps, FocusableElement, forwardRefType, RefObject} from '@react-types/shared';
13
+ import {AriaLabelingProps, FocusableElement, forwardRefType, GlobalDOMAttributes, RefObject} from '@react-types/shared';
14
14
  import {AriaPositionProps, mergeProps, OverlayContainer, Placement, PlacementAxis, PositionProps, useOverlayPosition, useTooltip, useTooltipTrigger} from 'react-aria';
15
15
  import {ContextValue, Provider, RenderProps, useContextProps, useRenderProps} from './utils';
16
+ import {filterDOMProps, useEnterAnimation, useExitAnimation, useLayoutEffect} from '@react-aria/utils';
16
17
  import {FocusableProvider} from '@react-aria/focus';
17
18
  import {OverlayArrowContext} from './OverlayArrow';
18
19
  import {OverlayTriggerProps, TooltipTriggerProps, TooltipTriggerState, useTooltipTriggerState} from 'react-stately';
19
20
  import React, {createContext, ForwardedRef, forwardRef, JSX, ReactNode, useContext, useRef, useState} from 'react';
20
- import {useEnterAnimation, useExitAnimation, useLayoutEffect} from '@react-aria/utils';
21
21
 
22
22
  export interface TooltipTriggerComponentProps extends TooltipTriggerProps {
23
23
  children: ReactNode
24
24
  }
25
25
 
26
- export interface TooltipProps extends PositionProps, Pick<AriaPositionProps, 'arrowBoundaryOffset'>, OverlayTriggerProps, AriaLabelingProps, RenderProps<TooltipRenderProps> {
26
+ export interface TooltipProps extends PositionProps, Pick<AriaPositionProps, 'arrowBoundaryOffset'>, OverlayTriggerProps, AriaLabelingProps, RenderProps<TooltipRenderProps>, GlobalDOMAttributes<HTMLDivElement> {
27
27
  /**
28
28
  * The ref for the element which the tooltip positions itself with respect to.
29
29
  *
@@ -160,11 +160,12 @@ function TooltipInner(props: TooltipProps & {isExiting: boolean, tooltipRef: Ref
160
160
  props = mergeProps(props, overlayProps);
161
161
  let {tooltipProps} = useTooltip(props, state);
162
162
 
163
+ let DOMProps = filterDOMProps(props, {global: true});
164
+
163
165
  return (
164
166
  <div
165
- {...tooltipProps}
167
+ {...mergeProps(DOMProps, renderProps, tooltipProps)}
166
168
  ref={props.tooltipRef}
167
- {...renderProps}
168
169
  style={{...overlayProps.style, ...renderProps.style}}
169
170
  data-placement={placement ?? undefined}
170
171
  data-entering={isEntering || undefined}
package/src/Tree.tsx CHANGED
@@ -15,12 +15,12 @@ import {ButtonContext} from './Button';
15
15
  import {CheckboxContext} from './RSPContexts';
16
16
  import {Collection, CollectionBuilder, CollectionNode, createBranchComponent, createLeafComponent, useCachedChildren} from '@react-aria/collections';
17
17
  import {CollectionProps, CollectionRendererContext, DefaultCollectionRenderer, ItemRenderProps} from './Collection';
18
- import {ContextValue, DEFAULT_SLOT, Provider, RenderProps, ScrollableProps, SlotProps, StyleRenderProps, useContextProps, useRenderProps} from './utils';
19
- import {DisabledBehavior, DragPreviewRenderer, Expandable, forwardRefType, HoverEvents, Key, LinkDOMProps, MultipleSelection, RefObject, SelectionMode} from '@react-types/shared';
18
+ import {ContextValue, DEFAULT_SLOT, Provider, RenderProps, SlotProps, StyleRenderProps, useContextProps, useRenderProps} from './utils';
19
+ import {DisabledBehavior, DragPreviewRenderer, Expandable, forwardRefType, GlobalDOMAttributes, HoverEvents, Key, LinkDOMProps, MultipleSelection, PressEvents, RefObject, SelectionMode} from '@react-types/shared';
20
20
  import {DragAndDropContext, DropIndicatorContext, useDndPersistedKeys, useRenderDropIndicator} from './DragAndDrop';
21
21
  import {DragAndDropHooks} from './useDragAndDrop';
22
22
  import {DraggableCollectionState, DroppableCollectionState, Collection as ICollection, Node, SelectionBehavior, TreeState, useTreeState} from 'react-stately';
23
- import {filterDOMProps, useObjectRef} from '@react-aria/utils';
23
+ import {filterDOMProps, inertValue, LoadMoreSentinelProps, useLoadMoreSentinel, useObjectRef} from '@react-aria/utils';
24
24
  import React, {createContext, ForwardedRef, forwardRef, JSX, ReactNode, useContext, useEffect, useMemo, useRef, useState} from 'react';
25
25
  import {TreeDropTargetDelegate} from './TreeDropTargetDelegate';
26
26
  import {useControlledState} from '@react-stately/utils';
@@ -28,13 +28,15 @@ import {useControlledState} from '@react-stately/utils';
28
28
  class TreeCollection<T> implements ICollection<Node<T>> {
29
29
  private flattenedRows: Node<T>[];
30
30
  private keyMap: Map<Key, CollectionNode<T>> = new Map();
31
+ private itemCount: number = 0;
31
32
 
32
33
  constructor(opts) {
33
34
  let {collection, expandedKeys} = opts;
34
- let {flattenedRows, keyMap} = flattenTree<T>(collection, {expandedKeys});
35
+ let {flattenedRows, keyMap, itemCount} = flattenTree<T>(collection, {expandedKeys});
35
36
  this.flattenedRows = flattenedRows;
36
37
  // Use generated keyMap because it contains the modified collection nodes (aka it adjusts the indexes so that they ignore the existence of the Content items)
37
38
  this.keyMap = keyMap;
39
+ this.itemCount = itemCount;
38
40
  }
39
41
 
40
42
  // TODO: should this collection's getters reflect the flattened structure or the original structure
@@ -44,7 +46,7 @@ class TreeCollection<T> implements ICollection<Node<T>> {
44
46
  }
45
47
 
46
48
  get size() {
47
- return this.flattenedRows.length;
49
+ return this.itemCount;
48
50
  }
49
51
 
50
52
  getKeys() {
@@ -64,7 +66,7 @@ class TreeCollection<T> implements ICollection<Node<T>> {
64
66
  }
65
67
 
66
68
  getLastKey() {
67
- return this.flattenedRows[this.size - 1]?.key;
69
+ return this.flattenedRows[this.flattenedRows.length - 1]?.key;
68
70
  }
69
71
 
70
72
  getKeyAfter(key: Key) {
@@ -132,8 +134,11 @@ export interface TreeRenderProps {
132
134
 
133
135
  export interface TreeEmptyStateRenderProps extends Omit<TreeRenderProps, 'isEmpty'> {}
134
136
 
135
- export interface TreeProps<T> extends Omit<AriaTreeProps<T>, 'children'>, MultipleSelection, CollectionProps<T>, StyleRenderProps<TreeRenderProps>, SlotProps, ScrollableProps<HTMLDivElement>, Expandable {
136
- /** How multiple selection should behave in the tree. */
137
+ export interface TreeProps<T> extends Omit<AriaTreeProps<T>, 'children'>, MultipleSelection, CollectionProps<T>, StyleRenderProps<TreeRenderProps>, SlotProps, Expandable, GlobalDOMAttributes<HTMLDivElement> {
138
+ /**
139
+ * How multiple selection should behave in the tree.
140
+ * @default "toggle"
141
+ */
137
142
  selectionBehavior?: SelectionBehavior,
138
143
  /** Provides content to display when there are no items in the list. */
139
144
  renderEmptyState?: (props: TreeEmptyStateRenderProps) => ReactNode,
@@ -361,9 +366,7 @@ function TreeInner<T extends object>({props, collection, treeRef: ref}: TreeInne
361
366
  let {isEmpty, ...values} = renderValues;
362
367
  let content = props.renderEmptyState({...values});
363
368
  let treeGridRowProps = {
364
- 'aria-level': 1,
365
- 'aria-posinset': 1,
366
- 'aria-setsize': 1
369
+ 'aria-level': 1
367
370
  };
368
371
 
369
372
  emptyState = (
@@ -375,16 +378,15 @@ function TreeInner<T extends object>({props, collection, treeRef: ref}: TreeInne
375
378
  );
376
379
  }
377
380
 
381
+ let DOMProps = filterDOMProps(props, {global: true});
382
+
378
383
  return (
379
384
  <>
380
385
  <FocusScope>
381
386
  <div
382
- {...filterDOMProps(props)}
383
- {...renderProps}
384
- {...mergeProps(gridProps, focusProps, droppableCollection?.collectionProps)}
387
+ {...mergeProps(DOMProps, renderProps, gridProps, focusProps, droppableCollection?.collectionProps)}
385
388
  ref={ref}
386
389
  slot={props.slot || undefined}
387
- onScroll={props.onScroll}
388
390
  data-empty={state.collection.size === 0 || undefined}
389
391
  data-focused={isFocused || undefined}
390
392
  data-drop-target={isRootDropTarget || undefined}
@@ -461,7 +463,7 @@ export const TreeItemContent = /*#__PURE__*/ createLeafComponent('content', func
461
463
 
462
464
  export const TreeItemContentContext = createContext<TreeItemContentRenderProps | null>(null);
463
465
 
464
- export interface TreeItemProps<T = object> extends StyleRenderProps<TreeItemRenderProps>, LinkDOMProps, HoverEvents, Pick<AriaTreeItemOptions, 'hasChildItems'> {
466
+ export interface TreeItemProps<T = object> extends StyleRenderProps<TreeItemRenderProps>, LinkDOMProps, HoverEvents, PressEvents, Pick<AriaTreeItemOptions, 'hasChildItems'>, Omit<GlobalDOMAttributes<HTMLDivElement>, 'onClick'> {
465
467
  /** The unique id of the tree row. */
466
468
  id?: Key,
467
469
  /** The object value that this tree item represents. When using dynamic collections, this is set automatically. */
@@ -496,7 +498,7 @@ export const TreeItem = /*#__PURE__*/ createBranchComponent('item', <T extends o
496
498
  shouldSelectOnPressUp: !!dragState
497
499
  }, state, ref);
498
500
  let isExpanded = rowProps['aria-expanded'] === true;
499
- let hasChildItems = props.hasChildItems || [...state.collection.getChildren!(item.key)]?.length > 1;;
501
+ let hasChildItems = props.hasChildItems || [...state.collection.getChildren!(item.key)]?.length > 1;
500
502
  let level = rowProps['aria-level'] || 1;
501
503
 
502
504
  let {hoverProps, isHovered} = useHover({
@@ -607,6 +609,9 @@ export const TreeItem = /*#__PURE__*/ createBranchComponent('item', <T extends o
607
609
  });
608
610
 
609
611
  let activateButtonId = useId();
612
+ let DOMProps = filterDOMProps(props as any, {global: true});
613
+ delete DOMProps.id;
614
+ delete DOMProps.onClick;
610
615
 
611
616
  return (
612
617
  <>
@@ -634,7 +639,7 @@ export const TreeItem = /*#__PURE__*/ createBranchComponent('item', <T extends o
634
639
  )}
635
640
  <div
636
641
  {...mergeProps(
637
- filterDOMProps(props as any),
642
+ DOMProps,
638
643
  rowProps,
639
644
  focusProps,
640
645
  hoverProps,
@@ -695,7 +700,7 @@ export const TreeItem = /*#__PURE__*/ createBranchComponent('item', <T extends o
695
700
  );
696
701
  });
697
702
 
698
- export interface UNSTABLE_TreeLoadingIndicatorRenderProps {
703
+ export interface TreeLoadMoreItemRenderProps {
699
704
  /**
700
705
  * What level the tree item has within the tree.
701
706
  * @selector [data-level]
@@ -703,23 +708,46 @@ export interface UNSTABLE_TreeLoadingIndicatorRenderProps {
703
708
  level: number
704
709
  }
705
710
 
706
- export interface TreeLoaderProps extends RenderProps<UNSTABLE_TreeLoadingIndicatorRenderProps>, StyleRenderProps<UNSTABLE_TreeLoadingIndicatorRenderProps> {}
711
+ export interface TreeLoadMoreItemProps extends Omit<LoadMoreSentinelProps, 'collection'>, RenderProps<TreeLoadMoreItemRenderProps> {
712
+ /**
713
+ * The load more spinner to render when loading additional items.
714
+ */
715
+ children?: ReactNode | ((values: TreeLoadMoreItemRenderProps & {defaultChildren: ReactNode | undefined}) => ReactNode),
716
+ /**
717
+ * Whether or not the loading spinner should be rendered or not.
718
+ */
719
+ isLoading?: boolean
720
+ }
707
721
 
708
- export const UNSTABLE_TreeLoadingIndicator = createLeafComponent('loader', function TreeLoader<T extends object>(props: TreeLoaderProps, ref: ForwardedRef<HTMLDivElement>, item: Node<T>) {
722
+ export const TreeLoadMoreItem = createLeafComponent('loader', function TreeLoadingSentinel<T extends object>(props: TreeLoadMoreItemProps, ref: ForwardedRef<HTMLDivElement>, item: Node<T>) {
723
+ let {isVirtualized} = useContext(CollectionRendererContext);
709
724
  let state = useContext(TreeStateContext)!;
710
- // This loader row is is non-interactable, but we want the same aria props calculated as a typical row
711
- // @ts-ignore
712
- let {rowProps} = useTreeItem({node: item}, state, ref);
725
+ let {isLoading, onLoadMore, scrollOffset, ...otherProps} = props;
726
+ let sentinelRef = useRef(null);
727
+ let memoedLoadMoreProps = useMemo(() => ({
728
+ onLoadMore,
729
+ // this collection will update anytime a row is expanded/collapsed becaused the flattenedRows will change.
730
+ // This means onLoadMore will trigger but that might be ok cause the user should have logic to handle multiple loadMore calls
731
+ collection: state?.collection,
732
+ sentinelRef,
733
+ scrollOffset
734
+ }), [onLoadMore, scrollOffset, state?.collection]);
735
+ useLoadMoreSentinel(memoedLoadMoreProps, sentinelRef);
736
+
737
+ ref = useObjectRef<HTMLDivElement>(ref);
738
+ let {rowProps, gridCellProps} = useTreeItem({node: item}, state, ref);
713
739
  let level = rowProps['aria-level'] || 1;
714
740
 
741
+ // For now don't include aria-posinset and aria-setsize on loader since they aren't keyboard focusable
742
+ // Arguably shouldn't include them ever since it might be confusing to the user to include the loaders as part of the
743
+ // item count
715
744
  let ariaProps = {
716
- 'aria-level': rowProps['aria-level'],
717
- 'aria-posinset': rowProps['aria-posinset'],
718
- 'aria-setsize': rowProps['aria-setsize']
745
+ role: 'row',
746
+ 'aria-level': rowProps['aria-level']
719
747
  };
720
748
 
721
749
  let renderProps = useRenderProps({
722
- ...props,
750
+ ...otherProps,
723
751
  id: undefined,
724
752
  children: item.rendered,
725
753
  defaultClassName: 'react-aria-TreeLoader',
@@ -727,19 +755,30 @@ export const UNSTABLE_TreeLoadingIndicator = createLeafComponent('loader', funct
727
755
  level
728
756
  }
729
757
  });
758
+ let style = {};
759
+
760
+ if (isVirtualized) {
761
+ style = {display: 'contents'};
762
+ }
730
763
 
731
764
  return (
732
765
  <>
733
- <div
734
- role="row"
735
- ref={ref}
736
- {...mergeProps(filterDOMProps(props as any), ariaProps)}
737
- {...renderProps}
738
- data-level={level}>
739
- <div role="gridcell" aria-colindex={1}>
740
- {renderProps.children}
741
- </div>
766
+ {/* Alway render the sentinel. For now onus is on the user for styling when using flex + gap (this would introduce a gap even though it doesn't take room) */}
767
+ {/* @ts-ignore - compatibility with React < 19 */}
768
+ <div style={{position: 'relative', width: 0, height: 0}} inert={inertValue(true)} >
769
+ <div data-testid="loadMoreSentinel" ref={sentinelRef} style={{position: 'absolute', height: 1, width: 1}} />
742
770
  </div>
771
+ {isLoading && renderProps.children && (
772
+ <div
773
+ ref={ref}
774
+ {...mergeProps(filterDOMProps(props as any), ariaProps)}
775
+ {...renderProps}
776
+ data-level={level}>
777
+ <div {...gridCellProps} style={style}>
778
+ {renderProps.children}
779
+ </div>
780
+ </div>
781
+ )}
743
782
  </>
744
783
  );
745
784
  });
@@ -759,7 +798,8 @@ interface TreeGridCollectionOptions {
759
798
 
760
799
  interface FlattenedTree<T> {
761
800
  flattenedRows: Node<T>[],
762
- keyMap: Map<Key, CollectionNode<T>>
801
+ keyMap: Map<Key, CollectionNode<T>>,
802
+ itemCount: number
763
803
  }
764
804
 
765
805
  function flattenTree<T>(collection: TreeCollection<T>, opts: TreeGridCollectionOptions): FlattenedTree<T> {
@@ -768,6 +808,8 @@ function flattenTree<T>(collection: TreeCollection<T>, opts: TreeGridCollectionO
768
808
  } = opts;
769
809
  let keyMap: Map<Key, CollectionNode<T>> = new Map();
770
810
  let flattenedRows: Node<T>[] = [];
811
+ // Need to count the items here because BaseCollection will return the full item count regardless if items are hidden via collapsed rows
812
+ let itemCount = 0;
771
813
 
772
814
  let visitNode = (node: Node<T>) => {
773
815
  if (node.type === 'item' || node.type === 'loader') {
@@ -792,9 +834,14 @@ function flattenTree<T>(collection: TreeCollection<T>, opts: TreeGridCollectionO
792
834
  keyMap.set(node.key, node as CollectionNode<T>);
793
835
  }
794
836
 
795
- if (node.level === 0 || (parentKey != null && expandedKeys.has(parentKey) && flattenedRows.find(row => row.key === parentKey))) {
796
- // Grab the modified node from the key map so our flattened list and modified key map point to the same nodes
797
- flattenedRows.push(keyMap.get(node.key) || node);
837
+ // Grab the modified node from the key map so our flattened list and modified key map point to the same nodes
838
+ let modifiedNode = keyMap.get(node.key) || node;
839
+ if (modifiedNode.level === 0 || (modifiedNode.parentKey != null && expandedKeys.has(modifiedNode.parentKey) && flattenedRows.find(row => row.key === modifiedNode.parentKey))) {
840
+ if (modifiedNode.type === 'item') {
841
+ itemCount++;
842
+ }
843
+
844
+ flattenedRows.push(modifiedNode);
798
845
  }
799
846
  } else if (node.type !== null) {
800
847
  keyMap.set(node.key, node as CollectionNode<T>);
@@ -811,7 +858,8 @@ function flattenTree<T>(collection: TreeCollection<T>, opts: TreeGridCollectionO
811
858
 
812
859
  return {
813
860
  flattenedRows,
814
- keyMap
861
+ keyMap,
862
+ itemCount
815
863
  };
816
864
  }
817
865
 
@@ -84,11 +84,15 @@ export class TreeDropTargetDelegate<T> {
84
84
  if (target.dropPosition === 'before') {
85
85
  let keyBefore = this.state!.collection.getKeyBefore(target.key);
86
86
  if (keyBefore != null) {
87
- target = {
87
+ let convertedTarget = {
88
88
  type: 'item',
89
89
  key: keyBefore,
90
90
  dropPosition: 'after'
91
91
  } as const;
92
+
93
+ if (isValidDropTarget(convertedTarget)) {
94
+ target = convertedTarget;
95
+ }
92
96
  }
93
97
  }
94
98
 
package/src/index.ts CHANGED
@@ -39,7 +39,7 @@ export {DropZone, DropZoneContext} from './DropZone';
39
39
  export {FieldError, FieldErrorContext} from './FieldError';
40
40
  export {FileTrigger} from './FileTrigger';
41
41
  export {Form, FormContext} from './Form';
42
- export {UNSTABLE_GridListLoadingSentinel, GridList, GridListItem, GridListContext} from './GridList';
42
+ export {GridListLoadMoreItem, GridList, GridListItem, GridListContext} from './GridList';
43
43
  export {Group, GroupContext} from './Group';
44
44
  export {Header, HeaderContext} from './Header';
45
45
  export {Heading} from './Heading';
@@ -49,7 +49,7 @@ export {Collection, createLeafComponent as UNSTABLE_createLeafComponent, createB
49
49
  export {Keyboard, KeyboardContext} from './Keyboard';
50
50
  export {Label, LabelContext} from './Label';
51
51
  export {Link, LinkContext} from './Link';
52
- export {UNSTABLE_ListBoxLoadingSentinel, ListBox, ListBoxItem, ListBoxSection, ListBoxContext, ListStateContext} from './ListBox';
52
+ export {ListBoxLoadMoreItem, ListBox, ListBoxItem, ListBoxSection, ListBoxContext, ListStateContext} from './ListBox';
53
53
  export {Menu, MenuItem, MenuTrigger, MenuSection, MenuContext, MenuStateContext, RootMenuTriggerStateContext, SubmenuTrigger} from './Menu';
54
54
  export {Meter, MeterContext} from './Meter';
55
55
  export {Modal, ModalOverlay, ModalContext} from './Modal';
@@ -63,7 +63,7 @@ export {Select, SelectValue, SelectContext, SelectValueContext, SelectStateConte
63
63
  export {Separator, SeparatorContext} from './Separator';
64
64
  export {Slider, SliderOutput, SliderTrack, SliderThumb, SliderContext, SliderOutputContext, SliderTrackContext, SliderStateContext} from './Slider';
65
65
  export {Switch, SwitchContext} from './Switch';
66
- export {UNSTABLE_TableLoadingSentinel, Table, Row, Cell, Column, ColumnResizer, TableHeader, TableBody, TableContext, ResizableTableContainer, useTableOptions, TableStateContext, TableColumnResizeStateContext} from './Table';
66
+ export {TableLoadMoreItem, Table, Row, Cell, Column, ColumnResizer, TableHeader, TableBody, TableContext, ResizableTableContainer, useTableOptions, TableStateContext, TableColumnResizeStateContext} from './Table';
67
67
  export {TableLayout} from './TableLayout';
68
68
  export {Tabs, TabList, TabPanel, Tab, TabsContext, TabListStateContext} from './Tabs';
69
69
  export {TagGroup, TagGroupContext, TagList, TagListContext, Tag} from './TagGroup';
@@ -75,7 +75,7 @@ export {ToggleButton, ToggleButtonContext} from './ToggleButton';
75
75
  export {ToggleButtonGroup, ToggleButtonGroupContext, ToggleGroupStateContext} from './ToggleButtonGroup';
76
76
  export {Toolbar, ToolbarContext} from './Toolbar';
77
77
  export {TooltipTrigger, Tooltip, TooltipTriggerStateContext, TooltipContext} from './Tooltip';
78
- export {UNSTABLE_TreeLoadingIndicator, Tree, TreeItem, TreeContext, TreeItemContent, TreeStateContext} from './Tree';
78
+ export {TreeLoadMoreItem, Tree, TreeItem, TreeContext, TreeItemContent, TreeStateContext} from './Tree';
79
79
  export {useDragAndDrop} from './useDragAndDrop';
80
80
  export {DropIndicator, DropIndicatorContext, DragAndDropContext} from './DragAndDrop';
81
81
  export {Virtualizer} from './Virtualizer';
@@ -106,14 +106,14 @@ export type {DropZoneProps, DropZoneRenderProps} from './DropZone';
106
106
  export type {FieldErrorProps, FieldErrorRenderProps} from './FieldError';
107
107
  export type {FileTriggerProps} from './FileTrigger';
108
108
  export type {FormProps} from './Form';
109
- export type {GridListProps, GridListRenderProps, GridListItemProps, GridListItemRenderProps} from './GridList';
109
+ export type {GridListProps, GridListRenderProps, GridListItemProps, GridListItemRenderProps, GridListLoadMoreItemProps} from './GridList';
110
110
  export type {GroupProps, GroupRenderProps} from './Group';
111
111
  export type {HeadingProps} from './Heading';
112
112
  export type {InputProps, InputRenderProps} from './Input';
113
113
  export type {SectionProps, CollectionRenderer} from './Collection';
114
114
  export type {LabelProps} from './Label';
115
115
  export type {LinkProps, LinkRenderProps} from './Link';
116
- export type {ListBoxProps, ListBoxRenderProps, ListBoxItemProps, ListBoxItemRenderProps, ListBoxSectionProps} from './ListBox';
116
+ export type {ListBoxProps, ListBoxRenderProps, ListBoxItemProps, ListBoxItemRenderProps, ListBoxSectionProps, ListBoxLoadMoreItemProps} from './ListBox';
117
117
  export type {MenuProps, MenuItemProps, MenuItemRenderProps, MenuTriggerProps, SubmenuTriggerProps, MenuSectionProps} from './Menu';
118
118
  export type {MeterProps, MeterRenderProps} from './Meter';
119
119
  export type {ModalOverlayProps, ModalRenderProps} from './Modal';
@@ -127,7 +127,7 @@ export type {SelectProps, SelectValueProps, SelectValueRenderProps, SelectRender
127
127
  export type {SeparatorProps} from './Separator';
128
128
  export type {SliderOutputProps, SliderProps, SliderRenderProps, SliderThumbProps, SliderTrackProps, SliderTrackRenderProps, SliderThumbRenderProps} from './Slider';
129
129
  export type {SwitchProps, SwitchRenderProps} from './Switch';
130
- export type {TableProps, TableRenderProps, TableHeaderProps, TableBodyProps, TableBodyRenderProps, ResizableTableContainerProps, ColumnProps, ColumnRenderProps, ColumnResizerProps, ColumnResizerRenderProps, RowProps, RowRenderProps, CellProps, CellRenderProps} from './Table';
130
+ export type {TableProps, TableRenderProps, TableHeaderProps, TableBodyProps, TableBodyRenderProps, ResizableTableContainerProps, ColumnProps, ColumnRenderProps, ColumnResizerProps, ColumnResizerRenderProps, RowProps, RowRenderProps, CellProps, CellRenderProps, TableLoadMoreItemProps} from './Table';
131
131
  export type {TabListProps, TabListRenderProps, TabPanelProps, TabPanelRenderProps, TabProps, TabsProps, TabRenderProps, TabsRenderProps} from './Tabs';
132
132
  export type {TagGroupProps, TagListProps, TagListRenderProps, TagProps, TagRenderProps} from './TagGroup';
133
133
  export type {TextAreaProps} from './TextArea';
@@ -138,7 +138,7 @@ export type {ToggleButtonProps, ToggleButtonRenderProps} from './ToggleButton';
138
138
  export type {ToggleButtonGroupProps, ToggleButtonGroupRenderProps} from './ToggleButtonGroup';
139
139
  export type {ToolbarProps, ToolbarRenderProps} from './Toolbar';
140
140
  export type {TooltipProps, TooltipRenderProps, TooltipTriggerComponentProps} from './Tooltip';
141
- export type {TreeProps, TreeRenderProps, TreeItemProps, TreeItemRenderProps, TreeItemContentProps, TreeItemContentRenderProps} from './Tree';
141
+ export type {TreeProps, TreeRenderProps, TreeItemProps, TreeItemRenderProps, TreeItemContentProps, TreeItemContentRenderProps, TreeLoadMoreItemProps, TreeLoadMoreItemRenderProps} from './Tree';
142
142
  export type {DragAndDropHooks, DragAndDropOptions} from './useDragAndDrop';
143
143
  export type {DropIndicatorProps, DropIndicatorRenderProps} from './DragAndDrop';
144
144
  export type {ContextValue, RenderProps, SlotProps, StyleRenderProps} from './utils';
@@ -50,7 +50,7 @@ interface DragHooks {
50
50
  useDraggableCollection?: (props: DraggableCollectionOptions, state: DraggableCollectionState, ref: RefObject<HTMLElement | null>) => void,
51
51
  useDraggableItem?: (props: DraggableItemProps, state: DraggableCollectionState) => DraggableItemResult,
52
52
  DragPreview?: typeof DragPreview,
53
- renderDragPreview?: (items: DragItem[]) => JSX.Element,
53
+ renderDragPreview?: (items: DragItem[]) => JSX.Element | {element: JSX.Element, x: number, y: number},
54
54
  isVirtualDragging?: () => boolean
55
55
  }
56
56
 
@@ -81,7 +81,7 @@ export interface DragAndDropOptions extends Omit<DraggableCollectionProps, 'prev
81
81
  * A function that renders a drag preview, which is shown under the user's cursor while dragging.
82
82
  * By default, a copy of the dragged element is rendered.
83
83
  */
84
- renderDragPreview?: (items: DragItem[]) => JSX.Element,
84
+ renderDragPreview?: (items: DragItem[]) => JSX.Element | {element: JSX.Element, x: number, y: number},
85
85
  /**
86
86
  * A function that renders a drop indicator element between two items in a collection.
87
87
  * This should render a `<DropIndicator>` element. If this function is not provided, a
package/src/utils.tsx CHANGED
@@ -12,7 +12,7 @@
12
12
 
13
13
  import {AriaLabelingProps, RefObject, DOMProps as SharedDOMProps} from '@react-types/shared';
14
14
  import {mergeProps, mergeRefs, useLayoutEffect, useObjectRef} from '@react-aria/utils';
15
- import React, {Context, CSSProperties, ForwardedRef, JSX, ReactNode, RefCallback, UIEvent, useCallback, useContext, useMemo, useRef, useState} from 'react';
15
+ import React, {Context, CSSProperties, ForwardedRef, JSX, ReactNode, RefCallback, useCallback, useContext, useMemo, useRef, useState} from 'react';
16
16
 
17
17
  export const DEFAULT_SLOT = Symbol('default');
18
18
 
@@ -63,21 +63,21 @@ export interface DOMProps extends StyleProps, SharedDOMProps {
63
63
  children?: ReactNode
64
64
  }
65
65
 
66
- export interface ScrollableProps<T extends Element> {
67
- /** Handler that is called when a user scrolls. See [MDN](https://developer.mozilla.org/en-US/docs/Web/API/Element/scroll_event). */
68
- onScroll?: (e: UIEvent<T>) => void
69
- }
66
+ type ClassNameOrFunction<T> = string | ((values: T & {defaultClassName: string | undefined}) => string);
67
+ type StyleOrFunction<T> = CSSProperties | ((values: T & {defaultStyle: CSSProperties}) => CSSProperties | undefined);
70
68
 
71
69
  export interface StyleRenderProps<T> {
72
70
  /** The CSS [className](https://developer.mozilla.org/en-US/docs/Web/API/Element/className) for the element. A function may be provided to compute the class based on component state. */
73
- className?: string | ((values: T & {defaultClassName: string | undefined}) => string),
71
+ className?: ClassNameOrFunction<T>,
74
72
  /** The inline [style](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/style) for the element. A function may be provided to compute the style based on component state. */
75
- style?: CSSProperties | ((values: T & {defaultStyle: CSSProperties}) => CSSProperties | undefined)
73
+ style?: StyleOrFunction<T>
76
74
  }
77
75
 
76
+ type ChildrenOrFunction<T> = ReactNode | ((values: T & {defaultChildren: ReactNode | undefined}) => ReactNode);
77
+
78
78
  export interface RenderProps<T> extends StyleRenderProps<T> {
79
79
  /** The children of the component. A function may be provided to alter the children based on component state. */
80
- children?: ReactNode | ((values: T & {defaultChildren: ReactNode | undefined}) => ReactNode)
80
+ children?: ChildrenOrFunction<T>
81
81
  }
82
82
 
83
83
  interface RenderPropsHookOptions<T> extends RenderProps<T>, SharedDOMProps, AriaLabelingProps {
@@ -180,7 +180,7 @@ export function useSlottedContext<T>(context: Context<SlottedContextValue<T>>, s
180
180
  return ctx;
181
181
  }
182
182
 
183
- export function useContextProps<T, U extends SlotProps, E extends Element>(props: T & SlotProps, ref: ForwardedRef<E>, context: Context<ContextValue<U, E>>): [T, RefObject<E | null>] {
183
+ export function useContextProps<T, U extends SlotProps, E extends Element>(props: T & SlotProps, ref: ForwardedRef<E> | undefined, context: Context<ContextValue<U, E>>): [T, RefObject<E | null>] {
184
184
  let ctx = useSlottedContext(context, props.slot) || {};
185
185
  // @ts-ignore - TS says "Type 'unique symbol' cannot be used as an index type." but not sure why.
186
186
  let {ref: contextRef, ...contextProps} = ctx as any;